Перехват исключения внутри IDisposable.Dispose - PullRequest
27 голосов
/ 21 октября 2008

В методе IDisposable.Dispose есть ли способ выяснить, генерируется ли исключение?

using (MyWrapper wrapper = new MyWrapper())
{
    throw new Exception("Bad error.");
}

Если в операторе using выдается исключение, я хочу знать об этом при удалении объекта IDisposable.

Ответы [ 11 ]

0 голосов
/ 22 октября 2008

Это будет ловить исключения, сгенерированные либо напрямую, либо внутри метода dispose:

try
{
    using (MyWrapper wrapper = new MyWrapper())
    {
        throw new MyException("Bad error.");
    }
}
catch ( MyException myex ) {
    //deal with your exception
}
catch ( Exception ex ) {
    //any other exception thrown by either
    //MyWrapper..ctor() or MyWrapper.Dispose()
}

Но это зависит от них, использующих этот код - похоже, вы хотите, чтобы MyWrapper сделал это вместо этого.

Оператор using просто гарантирует, что Dispose всегда вызывается. Это действительно делает это:

MyWrapper wrapper;
try
{
    wrapper = new MyWrapper();
}
finally {
    if( wrapper != null )
        wrapper.Dispose();
}

Звучит так, как вы хотите:

MyWrapper wrapper;
try
{
    wrapper = new MyWrapper();
}
finally {
    try{
        if( wrapper != null )
            wrapper.Dispose();
    }
    catch {
        //only errors thrown by disposal
    }
}

Я бы посоветовал разобраться с этим в вашей реализации Dispose - вы все равно должны решать любые вопросы во время Disposal.

Если вы связываете какой-то ресурс, где вам нужно, чтобы пользователи вашего API каким-либо образом освободили его, рассмотрите вариант использования метода Close(). Ваше распоряжение должно также вызывать его (если это еще не было), но пользователи вашего API могут также вызывать его сами, если им необходим более точный контроль.

...