c #: Как обрабатывать исключения финализатора из сторонней библиотеки?

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

Что мне делать?

10
задан Mogsdad 15 September 2015 в 15:31
поделиться