終結器總是被.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
^^ - 好點。需要成爲一個真正的答案。 –