2009-11-13 15 views
0

我有实现IDisposable一次性课程如何检测是否有异常正在进行?

public class Foo: IDisposable { 
    public void Dispose() { 
     // do the disposing 
    } 
} 

类然后,我有使用类以下述方式的方法:

void Bar() { 
    using (var f = new Foo()) { 
     // do whatever 
    } 
} 

当代码离开使用{...}边界, Foo类上的Dispose方法被调用。我该如何在Dispose方法中检测代码是否自动地使用块或由于异常而离开?

回答

1

你不能,就我所知。考虑更改Foo到需要“身体”换行和执行的拉姆达的方法:

Foo(f => { 
    // do whatever 
}); 

然后,你的Foo实现可以包装呼叫到try/catch检测异常,做任何你想做的事(然后使用throw;重新推出)。

+0

这是一个好主意,thx。 – AngryHacker 2009-11-13 01:42:15

0

你不应该这样做 - 我无法想象一种方法来做到这一点。

实施IDisposable的主要思想是,以确保销毁对象时,资源将被释放。

现在,using结构的主要思想是,以保证后,由对象使用的所有资源被释放。

所以,你不应该依赖于为什么对象被用来执行这个操作。如果你这样做,你应该检查你的设计。

+0

有一种思想观点认为'IDisposable'和''''是通用RAII机制,可用于释放资源。在这种情况下,区分“成功”和“失败”情景是完全正常的,例如在D中有一流的语言支持,有'范围(成功)'和'范围(失败)';在C++中,可以使用'std :: uncaught_exception()';等。 – 2009-11-13 00:54:53

+0

@布鲁诺。是的,帕维尔说。 using关键字对于范围界定来说非常棒,并且与Dispose结合使用非常强大。 – AngryHacker 2009-11-13 01:41:37

+0

如果Dispose例程不能将事物恢复到可接受的状态,则应该抛出异常。此时,处置异常和原始异常都应该被传播(通过将原始异常作为抛出异常的InnerException进行清理)。然而,为了这个工作,处置者必须有一种方法来获得待处理的异常。 – supercat 2010-11-01 18:44:48

相关问题