Retrieve thrown exception in using (disposable) cleanup

E

Emil Astrom

Hi!

I wonder if there's a way to retrieve information about thrown, not yet
handled exceptions. My situation is similar to the code below:

class MySession : IDisposable
{
:
:
Dispose()
{
if (mytransaction.IsOpen)
throw new SessionException("Transaction not closed!", XXX);
}
}

OtherFunc()
{
using (MySession session)
{
:
throw new ErrorException("whoops!");
session.Commit();
}
}


What I want to do is to have a Dispose() method that can include the already
thrown exception as an inner exception in its own exception that it needs to
throw if it's called prematurely. What I would like to have in the example
above is a thrown SessionException with the ErrorException instance in the
InnerException property. Can this be done?

If not, then I can only see two options:
* not include ErrorException in my SessionException when I throw it, but
that means losing the original error
* not throw an exception in my Dispose method at all, but that means not
having any error messages for improper use of the MySession class, e.g.
forgetting to call Commit().

Maybe someone have more (and better) alternatives? All suggestions are
greatly appreciated!

Regards,

Emil
 
A

Alexander Shirshov

Emil,

It's generally suggested not to throw exceptions in Dispose:

http://blogs.msdn.com/clyon/archive/2004/09/23/233464.aspx

But if you insist... Can you save ErrorException in a field until Dispose
method called?

class MySession : : IDisposable
{
ErrorException thrownEx = null;

Dispose()
{
if (mytransaction.IsOpen)
throw new SessionException("Transaction not closed!", thrownEx);
}
}

OtherFunc()
{
using (MySession session)
{
:
thrownEx = new ErrorException("whoops!");
throw thrownEx;
session.Commit();
}
}

HTH,
Alexander
 
E

Emil Astrom

Alexander,

Thanks for the suggestion. I've thought about that too but the problem is
that I then explicitly have to catch all exceptions in the using scope (not
all of them are thrown by me). Doable, but it feels clumsy...

I hoped it might be possible to detect thrown exceptions in the same way
that Visual Studio does when debugging, but maybe I'll have to rethink my
design instead.

Cheers,

Emil
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top