2011-06-29 11 views
24

Espero que esto sea sencillo. Yo trabajo en una gran base de código, la calidad general es buena, pero en ocasiones se obtiene algunas de estas:¿Puedo eliminar una captura vacía con lanzamiento?

try 
{ 
    // Calls a .NET remoting method. 
} 
catch 
{ 
    throw; 
} 

cuenta que no hay, finalmente, la lógica y la captura no especifica ninguna excepción o hacer otra cosa que lo He proporcionado arriba. Sin embargo, sé que atrapar y volver a lanzar puede alterar la pila de llamadas en los detalles de la excepción. De lo que no estoy seguro es de si este comportamiento está aquí específicamente debido a una llamada remota de .NET.

¿Es seguro eliminar este try-catch? Por lo que puedo ver, lo es, pero pensé en verificar primero cualquier comportamiento extraño.

+2

@ Dan curioso por qué cree que la cuestión cambio fue requerido? –

+1

Aunque cambiar el título es algo delicado para hacer, tiendo a editarlos cuando creo que puede buscarse más. http://www.google.com/?q=can+i+remove+empty+catch+with+throw ahora apunta a su pregunta como la respuesta principal, y estoy seguro de que esta es la consulta que las personas escribirían con mayor probabilidad que tu título original. –

+0

Lo suficientemente justo, sospechaba que era para buscar. –

Respuesta

14

Por lo que sé, catch (Exception ex) { throw ex } restablece el stack-trace. Y solo catch { throw; } no.

Si no realiza ninguna lógica adicional en caso de error, p. Logging, no conozco ninguna razón para no eliminar esa captura.

21

Rethrowing como lo ha demostrado no debe cambiar la pila de llamadas, a menos que haya algo muy especial acerca de excepciones remotas. (Sé que hay algunos aspectos especiales, pero no creo que entran en juego aquí.) Este es el tipo de cosas lo que hace perder información:

catch(Exception e) 
{ 
    throw e; // Not throw; 
} 

Mi suposición es que algunos desarrolladores han incluido esto solo para que puedan poner un punto de interrupción en la línea throw. Me desharía de eso.

+3

El uso de 'throw' solo puede alterar el seguimiento de la pila ** si ** la excepción fue lanzada en el mismo marco de pila que la instrucción' throw' - en este caso el número de línea se restablece a la línea de la declaración 'throw' (en lugar de la línea desde la que originalmente se lanzó la excepción) – Justin

+2

Se ha eliminado, todo lo que necesito ahora es un número de defecto discreto para comprobarlo en contra :-) –

4

En ciertas situaciones relacionadas con la seguridad de acceso al código, la cláusula catch-rethrow puede ser una característica de seguridad necesaria. Pero dudo que se aplique aquí. Especialmente porque ninguna persona en su sano juicio usaría este patrón sin agregar un comentario.

El objetivo es evitar que los filtros de excepción se ejecuten teniendo al mismo tiempo mayores privilegios.

Unos pocos artículos relacionados:

http://blogs.msdn.com/b/shawnfa/archive/2005/03/31/404320.aspx
http://msdn.microsoft.com/en-us/library/8cd7yaws(v=VS.100).aspx
http://www.pluralsight-training.net/community/blogs/keith/archive/2005/03/31/7149.aspx


parece ser obsoleta desde .net 2:
Impersonation and Exception Filters in v2.0

+0

No es el caso para nosotros, ya que no lo hacemos usa CAS.Sin embargo, información interesante, gracias. –

Cuestiones relacionadas