析构函数中的异常(c#)?

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)我,我会用它包装TryCache-我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框架

例如,在.NET 2.NET 4中,您的应用程序将被终止

如果Finalize或Finalize的覆盖引发异常,并且运行时不由覆盖默认策略的应用程序托管,则运行时将终止该进程,并且不会执行活动的try-finally块或终结器.如果终结器无法释放或销毁资源,则此行为可确保进程完整性.

相比之下,在.NET 1中,只有终结器将被终止,您的应用程序将继续运行:

如果Finalize或Finalize的覆盖引发异常,则运行时将忽略该异常,终止该Finalize方法,并继续完成最终化过程.

你实际上要做的是实现一个IDisposable模式,所以把这个工作留给一个finilazer,在progrmatically调用Dispose.


Arn*_* F. 9

来自MSDN:

析构函数执行期间发生的异常值得特别提及.如果在析构函数执行期间发生异常,并且未捕获该异常,则终止该析构函数的执行并调用基类的析构函数(如果有).如果没有基类(如对象类型的情况)或者没有基类析构函数,则抛弃该异常.


Jak*_*cki 6

考虑实现IDisposable接口,而不是删除终结器中的文件.

析构函数执行期间发生的异常值得特别提及.如果在析构函数执行期间发生异常,并且未捕获该异常,则终止该析构函数的执行并调用基类的析构函数(如果有).如果没有基类(如对象类型的情况)或者没有基类析构函数,则抛弃该异常.

http://msdn.microsoft.com/en-us/library/aa664609%28v=vs.71%29.aspx