在Dispose方法中解决异常

时间:2016-03-28 13:10:19

标签: c#

是否可以在Token类的Dispose方法中标记异常? E.g:

//code before
using(var e = new Token()){
  //..
  throw new Exception();
  //..
}
//code after

我需要的是取消异常并继续使用代码。

如果发生异常并不重要。我知道我可以使用try / catch,但在这种情况下,如果可能,我想绕过去。

我在by:

中检测到异常
bool isExceptionOccurred = Marshal.GetExceptionPointers() != IntPtr.Zero || Marshal.GetExceptionCode() != 0;

1 个答案:

答案 0 :(得分:-1)

最好的方法是使用一个catch块,因为那是它的用途。不要试图将您的业务需求转换为语言,使用该语言来编写您需要的内容。

创建一个抽象层来处理你的泄漏异常"需求。例如:

public sealed class ExceptionGuard<T>:IDisposable where T:IDisposable
{
    private readonly T instance;

    public bool ExceptionOccurred { get; private set; }

    public ExceptionGuard(T instance) { this.instance = instance; }

    public void Use(Action<T> useInstance)
    {
        try
        {
            useInstance(instance);
        }
        catch(Exception ex)
        {
            this.ExceptionOccurred = true;
            // Hopefully do something with your exception
        }        
    }

    public void Dispose()
    {
        Dispose(true);
    }

    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            this.instance.Dispose();
        }
    }
}

在那之后,消费和检查是一件相当简单的事情。

var guard = new ExceptionGuard(new Token());

using (guard)
{
    guard.Use(token => /* Do something with your token */ );        
}

if (guard.ExceptionOccurred)
{
    // React accordingly to this
}