如何在引发异常时处置对象?

Mar*_*rio 1 c# dispose exception try-catch

我在构造函数中实例化一个一次性对象(在我的例子中是一个FileStream),需要对它进行一些工作.但是,这可能会引发任何数量的不同异常.现在我甚至不想过多地处理这些异常,并希望允许它们传播给调用者.但是,我需要先处理对象.现在最好的方法是什么?现在我只能想到这样的事情:

IDisposable disposableObject = InstantiateDisposable();
bool error = false;
try
{
    DoWork(disposableObject);
}
catch (ReallyBadException e)
{
    error = true;
    throw new EvenWorseException("some message", e);
}
catch (Exception)
{
    error = true;
    throw;
}
finally
{
    if (error) disposableObject.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

这是否正确或在某些特殊情况下是否会跳过Dispose()?有更简单的方法吗?它有点麻烦,如果你因为某种原因需要分别捕获一堆不同的异常,你总是需要复制并粘贴那个error = true;位.

编辑: 只是为了澄清:我只需要在DoWork()失败/抛出异常时处置该对象.如果这个方法成功,我不想暂时处理这个对象,因为稍后会有更多的工作要做.

Pau*_*ips 6

为什么不颠倒逻辑呢?

IDisposable disposableObject = InstantiateDisposable();
bool error = true;
try
{
    DoWork(disposableObject);
    error = false; // if it gets to this line, no exception was thrown
}
catch (ReallyBadException e)
{        
    throw new EvenWorseException("some message", e);
}    
finally
{
    if (error) disposableObject.Dispose();
}
Run Code Online (Sandbox Code Playgroud)