Los finalizadores siempre son llamados por .NET Framework, por lo que la secuencia podría estar fuera de control; e incluso si el constructor falló, el destructor todavía se puede activar.C#: ¿Cómo manejar las excepciones del finalizador de una biblioteca de terceros?
Esto podría traer problemas, cuando tales excepciones de finalizador provienen de una biblioteca de terceros: ¡No puedo encontrar una manera de manejarlos!
Por ejemplo, en el código siguiente, aunque el constructor de la clase A siempre lanza una excepción y falla, el finalizador de A será activado por .NET framework, también ~ B() se llama como A tiene una propiedad de tipo 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
}
}
Si estos son mi código, que es un poco más fácil - Puedo usar try-catch en finalizadores, al menos puedo hacer algo de tala - puedo permitir que la excepción se bloquee el programa, para descubrir el error asap - o si quiero "tolerar" la excepción, puedo tener un try-catch para suprimir la excepción, y tener una salida elegante.
Pero si A y B son clases de una biblioteca de terceros, ¡no puedo hacer nada! No puedo controlar la excepción, no puedo verlos, así que no puedo registrarla o suprimirla.
¿Qué puedo hacer?
+1 Problema interesante (y mientras tanto, genera un informe de error urgente con los proveedores de la biblioteca que suministra 'A' y' B'). – Ergwun
^^ - Gran punto. Necesita ser una respuesta real. –