2010-07-20 27 views
12
try { 
     if (isFileDownloaded) 
      //do stuff 
     else 
      throw new CustomException() 
    } 
    catch (Exception e) 
    { 
     // something went wrong save error to log 
    } 
    finally 
    { 
     //release resources 
    } 

Mi pregunta es si el catch capta el ApplicationException arrojado en el bloque try? ¿Tiene un estilo de codificación pobre? ¿Debería escribirse de otra manera?Lanzar excepción en try bloque

Respuesta

21

El catch se llamará la excepción (y cualquier otro que ocurre). Dicho esto, trato de evitar escribir código como este cuando sea posible.

Personalmente, veo pocas razones para tener el manejo de excepciones (catch) para una excepción lanzada en el mismo ámbito. Si puede manejar su error en su método, ponga también el manejo de excepciones (es decir, el registro) directamente en el bloque try.

El uso de catch es más útil, IMO, para capturar las excepciones lanzadas por los métodos dentro de su bloque try. Esto sería más útil, por ejemplo, si su sección // do stuff llamó a un método que generó una excepción.

Además, recomiendo no detectar todas las excepciones (Exception e), sino más bien los tipos específicos de excepciones que puede manejar correctamente. La única excepción a esto sería si está volviendo a lanzar la excepción dentro de su captura, es decir, si la usa para fines de registro, pero todavía deja que suba la pila de llamadas.

+3

Cualquier cosa que haría en la captura que puede hacer en el resto que plantea la excepción. Solo debe plantear excepciones en circunstancias excepcionales. Como comentario aparte, no debes acostumbrarte a llamar a los objetos de excepción 'e'. Esto chocará con el parámetro 'EventArgs' en los controladores de eventos. –

+0

@Philip: "Cualquier cosa que harías en la captura que puedas hacer en el resto de la excepción". - Ese fue mi punto :) En cuanto a tus otros argumentos, estoy de acuerdo con un punto, pero personalmente no tengo problemas para nombrar objetos de excepción e (aunque suelo usar un nombre más significativo), ya que raramente se usan con EventArgs directamente . –

+0

¿Por qué los votos a favor? Sólo curiosidad;) –

5

Sí, detectará ApplicationException como se deriva de Exception.

Manejo de la excepción de base debe estar bien en la mayoría de los casos a menos que necesite registrar o hacer algo con un tipo diferente de excepción ...

try{ 
    if (isFileDownloaded) 
     //do stuff 
    else 
     throw new ApplicationException(); 
} 
catch(ApplicationException ae) 
{ 
    // log it application exception here... 
} 

catch(Exception ex) 
{ 
    // log all other exceptions here... 
} 
finally 
{ 
    // release resources... 
} 
1

Sí, la captura atrapará su ApplicationException y sí es un estilo de codificación pobre. Como regla general, solo detecta excepciones específicas y aquellas con las que va a hacer algo, como arreglar el estado de la aplicación.

1

Además, FYI, ApplicationException ha quedado en desuso desde .NET 2.0 como una excepción de la que deriva. Nunca fue pensado como una excepción para lanzarse por sí mismo, por lo que probablemente no debería usarlo en absoluto.

+0

FxCop aplica estas reglas. No puede lanzar una excepción base ni derivar de 'ApplicationException' o' SystemException'. Estas son las excepciones básicas junto con 'Exception' en sí –

Cuestiones relacionadas