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