Roy*_*mir 3 c# garbage-collection destructor exception .net-4.0
我有这门课:
public class TempFileRef
{
public readonly string FilePath;
public TempFileRef(string filePath)
{
FilePath = filePath;
}
~TempFileRef()
{
File.Delete(FilePath); //<== what happens if exception ?
}
}
Run Code Online (Sandbox Code Playgroud)
题 :
如果析构函数中存在异常会发生什么?
1)它会打破F-Queue中的其他终结吗?
2)我,我会用它包装Try和Cache-我NEVER知道有一个错误
3)what我应该在这里吗?
它的MSDN模式基于"if I **forget** to call the Dispose method - so the GC will do it eventually.... it is better later then never...".所以我的问题是特别关于Finilize中的异常(析构函数)
ole*_*sii 14
这实际上取决于.NET框架
如果Finalize或Finalize的覆盖引发异常,并且运行时不由覆盖默认策略的应用程序托管,则运行时将终止该进程,并且不会执行活动的try-finally块或终结器.如果终结器无法释放或销毁资源,则此行为可确保进程完整性.
相比之下,在.NET 1中,只有终结器将被终止,您的应用程序将继续运行:
如果Finalize或Finalize的覆盖引发异常,则运行时将忽略该异常,终止该Finalize方法,并继续完成最终化过程.
你实际上要做的是实现一个IDisposable模式,所以把这个工作留给一个finilazer,在progrmatically调用Dispose.
考虑实现IDisposable接口,而不是删除终结器中的文件.
析构函数执行期间发生的异常值得特别提及.如果在析构函数执行期间发生异常,并且未捕获该异常,则终止该析构函数的执行并调用基类的析构函数(如果有).如果没有基类(如对象类型的情况)或者没有基类析构函数,则抛弃该异常.
http://msdn.microsoft.com/en-us/library/aa664609%28v=vs.71%29.aspx