2011-07-09 29 views
6

Al lanzar excepciones entre métodos múltiples, ¿deberían todos los métodos volver a lanzar la excepción? por ejemploC# Re-throwing Exceptions

Method1() 
{ 
    Method2(); 
} 

Method2() 
{ 
    try 
    { 
     // Do something 
    } 
    catch 
    { 
     throw; 
    } 
} 

try 
{ 
    Method1(); 
} 
catch 
{ 
    // Do something about exception that was thrown from Method2() 
} 

Note como en Method1(), no necesitaba para envolver Method2() en un bloque try, debería ser?

Respuesta

8

No es necesario que intente, atrape y vuelva a plantear excepciones a menos que tenga alguna razón particular para detectarlas en primer lugar. De lo contrario, van a automáticamente burbujear desde las funciones de nivel inferior que los arrojan a la función de nivel más alto en su código. Básicamente, puedes pensar en ellos como si estuviesen "recuperando" todo el camino hacia arriba, aunque esto técnicamente no es lo que está sucediendo.

De hecho, la mayoría de las veces que ve un bloque try/catch escrito, es incorrecto. No debe detectar excepciones a menos que realmente pueda manejarlas. No tiene sentido (y de hecho se considera que es una mala práctica) detectar excepciones solo para volver a lanzarlas. No ajuste todo su código dentro de los bloques try.

Tenga en cuenta que por "manejarlos", que significa que su código en el bloque catch tomará alguna acción específica basada en la excepción particular que fue arrojado que los intentos de correcta la condición excepcional.
Por ejemplo, para FileNotFoundException, puede informar al usuario que no se pudo encontrar el archivo y pedirle que elija otro.

Consulte my answer here para obtener más información y una explicación detallada de las "mejores prácticas para el manejo de excepciones".

9

No es necesario que envuelva todo en los bloques try.

Sólo debe try cuando se quiere catch algo, y sólo se debe catch algo en los siguientes casos:

  • Usted está listo para mango la excepción (hacer lo que hay que hacer y no deje que se propagan por la pila),
  • que quiere hacer algo con la excepción (por ejemplo, registrarlo) antes de Regeneración de ella (mediante el uso de la forma sin parámetros de throw),
  • desea agregar deta Iles a la excepción envolviéndolo en otra excepción suya (vea el excelente comentario de Allon Guralnek a continuación).
+3

+1: conciso y preciso. Agregaría una razón más que no es exactamente "volver a lanzar": ajuste una excepción dentro de una excepción diferente (pero siempre mantenga la excepción original en InnerException, de lo contrario, perderá información sobre la excepción original que podría ayudar a la eliminación de errores). El envoltorio podría brindar un contexto adicional que no puede ser reinventado, p. "Error al guardar un nuevo pedido para el Cliente 843, vea InnerException para más detalles". –

Cuestiones relacionadas