Финализаторы всегда вызываются .net framework, поэтому последовательность может быть неуправляемой;и даже если конструктор потерпел неудачу, деструктор все еще может быть запущен.
Это может вызвать проблемы, когда такие исключения финализатора поступают из сторонней библиотеки: я не могу найти способ обработать их!
Например, в приведенном ниже коде, хотя конструктор класса 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 в финализаторах, по крайней мере, я могу сделать некоторую регистрацию - я могу разрешить исключение, чтобы аварийно завершить программу, чтобыобнаружите ошибку как можно скорее - или если я хочу «допустить» исключение, я могу попытаться перехватить исключение и получить изящный выход.
Но если A и B являются классами от третьегоПартийная библиотека, ничего не могу поделать!Я не могу контролировать возникновение исключения, я не могу их поймать, поэтому я не могу его зарегистрировать или подавить!
Что я могу сделать?