终结器总是被.net框架调用,所以序列可能失控;即使构造函数失败,析构函数仍然可以被触发。c#:如何处理来自第三方库的终结器异常?
当这样的终结者异常来自第三方库时,这可能会带来麻烦:我无法找到处理它们的方法!
例如,在下面的代码中,虽然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的终结,至少我可以做一些记录 - 我可以允许例外程序崩溃,去发现错误asap - 或者如果我想“容忍”这个异常,我可以尝试一个catch来压制这个异常,并且有一个优雅的退出。
但是,如果A和B是来自第三方库的类,我什么都不能做! 我无法控制发生的异常,我无法捕捉它们,所以我无法登录或压制它!
我该怎么办?
+1有趣的问题(与此同时,向提供'A'和'B'的图书馆供应商发出紧急的错误报告)。 – Ergwun
^^ - 好点。需要成为一个真正的答案。 –