Search code examples
exceptionado.net.net-2.0error-handling

How to Catch an exception in a using block with .NET 2.0?


I'm trying to leverage the using block more and more these days when I have an object that implements IDisposable but one thing I have not figured out is how to catch an exception as I would in a normal try/catch/finally ... any code samples to point me in the right direction?

Edit: The question was modified after reading through the replies. It was "How to Throw an exception in a using block with .NET 2.0?" but I was actually looking for a way to catch these exceptions inside a using block.


I'm looking for more detail on rolling my own catching block inside a using block.

Edit: What I wanted to avoid is having to use a try/catch/finally inside my using block like @Blair showed. But maybe this is a non issue...

Edit: @Blair, this is exactly what I was looking for, thanks for the detailed reply!


Solution

  • I don't really understand the question - you throw an exception as you normally would. If MyThing implements IDisposable, then:

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

    And thing.Dispose will be called as you leave the block, as the exception's thrown. If you want to combine a try/catch/finally and a using, you can either nest them:

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

    (Or put the try/catch/finally in the using):

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

    Or you can unroll the using and explicitly call Dispose in the finally block as @Quarrelsome demonstrated, adding any extra exception-handling or -recovery code that you need in the finally (or in the catch).

    EDIT: In response to @Toran Billups, if you need to process exceptions aside from ensuring that your Dispose method is called, you'll either have to use a using and try/catch/finally or unroll the using - I don't thinks there's any other way to accomplish what you want.