2009-04-15 15 views
6

¿Cuáles son sus pensamientos sobre el código que se parece a esto:Reflexiones sobre bloques try-catch

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

El problema que veo es que no se maneja el error real, simplemente tirar la excepción en un lugar diferente. Me resulta más difícil de depurar porque no obtengo un número de línea donde está el problema real.

Así que mi pregunta es ¿por qué sería esto bueno?

---- ---- EDITAR

De las respuestas parece que la mayoría de la gente está diciendo que no tiene sentido hacer esto sin personalizados o específicos excepciones siendo capturados. En eso quería comentar, cuando no se detecta ninguna excepción específica. Puedo ver el punto de realmente hacer algo con una excepción atrapada, simplemente no como es este código.

Respuesta

15

Dependiendo de la calidad que esté mirando, no está lanzando la excepción en un lugar diferente. "throw" sin un objetivo vuelve a lanzar la excepción, que es muy diferente de lanzar una excepción. Principalmente, un nuevo lanzamiento no restablece el seguimiento de la pila.

En esta muestra particular, la captura no tiene sentido porque no hace nada. La excepción se retiró felizmente y es casi como si la prueba/captura no existiera.

+0

que he visto código como esto antes. Normalmente se inserta durante la depuración, por lo que alguien puede poner un punto de interrupción en el "lanzamiento". –

+0

@Joel, gotcha. Una mejor solución puede usar VS para romper el lanzamiento. Pero no es tan detallado como podría ser :( – JaredPar

+0

La ventaja sobre un punto de interrupción es que puede registrar detalles de un error no crítico durante la prueba de la unidad que a menudo es muy útil. –

0

He visto instancias en las que se detectan excepciones genéricas como esta y luego vuelvo a empaquetar en un objeto de excepción personalizado.

La diferencia entre eso y lo que usted dice es que esos objetos de excepción personalizados contienen MÁS información sobre la excepción real que sucedió, no menos.

3

Creo que la construcción se debe usar para manejar las excepciones que usted sabe que estará lanzando dentro de su código; si se levanta otra excepción, solo vuelva a lanzar.

Ten en cuenta que tiro; es diferente de throw ex;

throw ex truncará la pila al nuevo punto de lanzamiento, perdiendo información valiosa sobre la excepción.

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (EspecificException ex) 
    { 
     HandleException(ex); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 
+1

En su ejemplo, la captura (Excepción ex) no es necesaria. Simplemente no manejar Excepción tendrá el mismo efecto. –

0

Bueno, para empezar me gustaría simplemente hacer

catch 
{ 
    throw; 
} 

pero básicamente si estuviera atrapando varios tipos de excepciones que usted lo desea, puede manejar algunas localmente y otras copias de seguridad de la pila.

p. Ej.

catch(SQLException sex) //haha 
{ 
    DoStuff(sex); 
} 
catch 
{ 
    throw; 
} 
1

Hacer algo así es bastante sin sentido, y en general trato de no ir por el camino de hacer las cosas sin sentido;)

En su mayor parte, creo en la captura de determinados tipos de excepciones que usted sabe cómo manejarlo, incluso si eso solo significa crear su propia excepción con más información y usar la excepción atrapada como InnerException.

0

Depende de lo que quiere decir con "se ve así", y si no hay nada más en el bloque de catch sino un nuevo lanzamiento ...si ese es el caso, la captura de prueba no tiene sentido, excepto, como dices, para ocultar dónde ocurrió la excepción. Pero si necesita hacer algo allí mismo, donde ocurrió el error, pero desea manejar la excepción de la pila, esto podría ser apropiado. Pero entonces, la captura sería la excepción específico sea handl; ing, no por ninguna excepción

3

No sería, idealmente, el bloque catch haría alguna manipulación, y luego volver a lanzar, por ejemplo,

try 
{ 
    //do something 
} 
catch (Exception ex) 
{ 
    DoSomething(ex); //handle the exception 
    throw; 
} 

Por supuesto, el re-lanzamiento será útil si desea realizar un manejo adicional en los niveles superiores del código.

1

A veces esto es apropiado, cuando va a manejar la excepción más arriba en la pila de llamadas. Sin embargo, necesitarías hacer algo en ese bloque de captura que no sea simplemente volver a lanzar para que tenga sentido, p. log el error:

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (Exception ex) 
    { 
     LogException (ex); // Log error... 
     throw; 
    } 
} 
0

No creo que solo volver a tirar el error sería útil. A menos que realmente no te importe el error en primer lugar.

Creo que sería mejor hacer algo en la trampa.

Puede consultar el MSDN Exception Handling Guide.