Pregunta

Estoy tratando de aprovechar cada vez más el bloque de uso estos días cuando tengo un objeto que implementa IDisposable, pero una cosa que no he descubierto es cómo detectar una excepción como lo haría en un try/catch/finally normal...¿Algún ejemplo de código que me indique la dirección correcta?

Editar:La pregunta se modificó 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 manera de atrapar estas excepciones dentro de un bloque de uso.


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

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

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

¿Fue útil?

Solución

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

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

Y thing.Dispose Se llamará cuando abandones el bloque, cuando se produzca la excepción.Si desea combinar try/catch/finally yusing, puede anidarlos:

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

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

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

O puedes desenrollar el using y llamar explícitamente Dispose en el finally bloque como lo demostró @Quarrelsome, agregando cualquier código adicional de recuperación o manejo de excepciones que necesite en el finally (o en el catch).

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

Otros consejos

Sí, no hay nada diferente en generar 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ás que realizar tu propia captura si quieres atrapar algo, pero atrapar/lanzar es una preocupación completamente separada del uso.Es casi seguro que finalmente se ejecutará (salvo una excepción no detectable (p. ej.stackoverflow o outofmemory) o alguien desconectando la alimentación de la PC).

Necesita tener una declaración de prueba para detectar una excepción.

Puede usar una declaración de prueba dentro del bloque de uso o puede usar un bloque de uso en un bloque de prueba.

Pero necesitas usar un bloque try para detectar cualquier excepción que ocurra.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top