try practices practice net handling error custom catch best asp exception ado.net .net-2.0 error-handling

exception - practices - Cómo atrapar una excepción en un bloque que usa con.NET 2.0?



throw exception c# (3)

Estoy tratando de aprovechar el bloque de uso cada vez más cuando tengo un objeto que implementa IDisposable, pero una cosa que no he descubierto es cómo atrapar una excepción como lo haría en un try / catch / finally normal ... ¿Algun ejemplo de código para señalarme en la dirección correcta?

Editar: la pregunta fue modificada después de leer las respuestas. Fue "¿Cómo lanzar una excepción en un bloque de uso con .NET 2.0?" pero en realidad estaba buscando una forma de detectar estas excepciones dentro de un bloque de uso.

Estoy buscando más detalles sobre cómo rodar mi propio bloque de captura dentro de un bloque de uso.

Editar: Lo que quería evitar es tener que usar un try / catch / finally dentro de mi bloque de uso como @Blair mostró. Pero tal vez esto no es un problema ...

Editar: @Blair, esto es exactamente lo que estaba buscando, gracias por la respuesta detallada!


Necesitas tener una declaración try para atrapar una excepción

O puede usar una instrucción try dentro del bloque de uso o puede usar un bloque de uso en un bloque try

Pero necesita usar un bloque de prueba para detectar cualquier excepción que ocurra


Sí, no hay nada diferente en tirar excepciones al usar bloques. Recuerde que el bloque de uso básicamente se traduce en:

IDisposable disposable = null; try { disposable = new WhateverYouWantedToMake(); } finally { disposable.Dispose() }

Por lo tanto, tendrá que tirar su propia captura si quiere capturar algo, pero atrapar / arrojar es una preocupación completamente diferente del uso. Finalmente, se garantiza que se ejecutará (se guardará una excepción no detectable (por ejemplo, o outofmemory) o alguien que desconecte la alimentación de la PC).


Realmente no entiendo la pregunta: lanzas una excepción como lo harías normalmente. Si MyThing implementa IDisposable , entonces:

using ( MyThing thing = new MyThing() ) { ... throw new ApplicationException("oops"); }

Y thing.Dispose se llamará al salir del bloque, ya que la excepción se produce. Si desea combinar try / catch / finally y a using, puede anidarlos:

try { ... using ( MyThing thing = new MyThing() ) { ... } ... } catch ( Exception e ) { .... } finally { .... }

(O ponga el try / catch / finally en el uso):

using ( MyThing thing = new MyThing() ) { ... try { ... } catch ( Exception e ) { .... } finally { .... } ... } // thing.Dispose is called now

O puede desenrollar el using y explícitamente llame a Dispose en el bloque finally como @Quarrelsome demostrado, agregando cualquier código adicional de manejo de excepciones o recuperación que necesite en el final (o en el catch ).

EDITAR: en respuesta a @Toran Billups, si necesita procesar excepciones además de garantizar que se llama a su método Dispose , tendrá que usar un using y try/catch/finally o desenrollar el using - No creo hay otra forma de lograr lo que quieres.