2012-05-20 11 views
38

Tengo un código que deseo ejecutar si ocurre una excepción. Pero ese código también puede generar una excepción. Pero nunca he visto a la gente intentar/atrapar dentro de otro try/catch.Java: ¿es una mala práctica intentar/atrapar dentro de un try/catch?

es lo que estoy haciendo una mala práctica y tal vez hay una mejor forma de hacer esto:

Uri uri = Uri.parse("some url"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 

try 
{ 
    startActivity(intent); 
} 
catch (ActivityNotFoundException anfe) 
{ 
    // Make some alert to me 

    // Now try to redirect them to the web version: 
    Uri weburi = Uri.parse("some url"); 
    try 
    { 
     Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
     startActivity(webintent); 
    } 
    catch (Exception e) 
    { 
     // Make some alert to me       
    } 
} 

Parece un poco raro. ¿Hay algo que podría estar mal con eso?

+3

Puede considerar poner el código en el bloque catch en su propio método. –

+0

@HunterMcMillen buen punto. :) – GeekedOut

Respuesta

32

Está bien, aunque si su lógica de manejo de excepciones es tan compleja, podría considerar dividirla en su propia función.

9

Es una mala práctica escribir código con tantos niveles de anidamiento, especialmente en try-catch, así que diría: evitar. Por otro lado, lanzar una excepción desde el bloque catch es pecado imperdonable, por lo que debe tener mucho cuidado.

Mi consejo - Extracto de la lógica de catch en un método (por lo catch bloque es simple) y asegúrese de que este método nunca tirar nada:

Uri uri = Uri.parse("some url"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 

try 
{ 
    startActivity(intent); 
} 
catch (ActivityNotFoundException anfe) 
{ 
    // Make some alert to me 

    // Now try to redirect them to the web version: 
    Uri weburi = Uri.parse("some url"); 
    Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
    silentStartActivity(webintent) 
} 

//... 

private void silentStartActivity(Intent intent) { 
    try 
    { 
     startActivity(webintent); 
    } 
    catch (Exception e) 
    { 
     // Make some alert to me      
    } 
} 

También parece (puedo estar equivocado) que se están usando excepciones para controlar el flujo del programa. Tenga en cuenta el valor de retorno estándar si arrojar ActivityNotFoundException no es una situación excepcional, pero podría ocurrir en circunstancias normales.

+0

gracias ... ¿por qué dices que lanzar una excepción en un try/catch es un pecado? :) – GeekedOut

+1

"¿Tantos niveles?" Veo un gran total de tres. Su lógica en el bloque 'catch' no es más profunda que un bloque' if' en su bloque 'try'. –

+0

El problema que vi al dividirlo es que no sé cómo verificar la condición de si la excepción ocurrirá o no, ya que estoy tratando de ir a una url externa. – GeekedOut

3

respuesta es No..It es 100% bien .. Puede que tenga que utilizar gran cantidad de estos en JDBC y IO, porque tienen muchas excepciones a manipular, una dentro de otra ...

0

Aquí es solución alternativa si no desea utilizar try anidado y captura, también puede hacerlo de esta manera: Método

boolean flag = false; 
void test(); 
if(flag) 
    { 
    test2(); 
    } 

prueba va aquí:

private void test(){ 
    try { 
     Uri uri = Uri.parse("some url"); 
     Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
     startActivity(intent); 
    }catch (ActivityNotFoundException anfe){ 
     System.out.println(anfe); 
     flag =true; 
    } 
} 

Ahora poner el código de reposo en 2do método:

public void test2(){ 
    Uri weburi = Uri.parse("some url"); 
     try 
     { 
      Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
      startActivity(webintent); 
     } 
     catch (Exception e) 
     { 
      // Make some alert to me      
     } 
+0

En Java, y en muchos otros lenguajes de programación, puede escribir la misma lógica condicional de muchas maneras diferentes. La pregunta es por qué crees que tu método es mejor, más efectivo o más óptimo que simplemente escribir el segundo try/catch en el bloque catch del primer try/catch. – Bloodysock

Cuestiones relacionadas