c#:如何处理来自第 3 方库的终结器异常?

标签 c# exception finalizer

Finalizers 总是被 .net framework 调用,所以顺序可能会失控;即使构造函数失败,仍然可以触发析构函数。

当此类终结器异常来自第 3 方库时,这可能会带来麻烦:我找不到处理它们的方法!

例如,在下面的代码中,虽然 A 类的构造函数总是抛出异常并失败,但 A 的终结器将由 .net 框架触发,并且 ~B() 也会被调用,因为 A 具有 B 类型的属性。

class Program // my code
{
    static void Main(string[] args)
    {
        A objA;
        try
        {
            objA = new A();
        }
        catch (Exception)
        {
        }

        ; // when A() throws an exception, objA is null

        GC.Collect(); // however, this can force ~A() and ~B() to be called.

        Console.ReadLine();
    }
}

public class A  // 3rd-party code
{
    public B objB;

    public A()
    {
        objB = new B(); // this will lead ~B() to be called.
        throw new Exception("Exception in A()");
    }

    ~A() // called by .net framework
    {
        throw new Exception("Exception in ~A()"); // bad coding but I can't modify
    } 
}

public class B // 3rd-party code
{
    public B() { }

    ~B() // called by .net framework
    {
        throw new Exception("Exception in ~B()"); // bad coding but I can't modify
    } 
}

如果这些是我的代码,那就更容易了 - 我可以在终结器中使用 try-catch,至少我可以做一些日志记录 - 我可以允许异常使程序崩溃,尽快发现错误 - 或者如果我想“容忍”异常,我可以使用 try-catch 来抑制异常,然后优雅地退出。

但如果 A 和 B 是来自第三方库的类,我就无能为力了! 我无法控制异常的发生,我无法捕获它们,所以我无法记录或抑制它!

我能做什么?

最佳答案

听起来第 3 方实用程序写得不好。 :)

您是否尝试过使用 AppDomain.UnhandledException 捕获它? ?

关于c#:如何处理来自第 3 方库的终结器异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728017/

相关文章:

c# - Equals Method 的默认行为是什么?

java - Hadoop:配置对象时出错

c# - Image.FromStream() 方法返回 Invalid Argument 异常

java - 为什么在 wicket 模型中 Finalize 方法被调用 2 次

c# - 什么是终结者?

c# - 调试对象未能完成?

c# - 客户端发现响应内容类型为 'text/html' ,但预期为 'text/xml'

c# - JQuery 将值设置为自定义服务器控件

c# - Docker容器中的.net核心控制台应用程序引发System.ObjectDisposedException

.net - 在使用 IronPython 和 C#/.NET 作为主机时,如何在运行时错误中获取有问题的行?