tipos - try catch c#
Evitar que las excepciones del componente de terceros bloqueen la aplicaciĆ³n completa (2)
Estoy escribiendo una aplicación multiproceso que se basa en algunas DLL de terceros. Mi problema es que al usar un objeto de la biblioteca de terceros, si se produce una excepción mientras se está ejecutando, no puedo atraparlo y explota y mata toda la aplicación. Tengo muchos hilos diferentes cada uno usando su propio objeto de esta biblioteca de terceros y necesito el hilo que estaba usando esa copia del objeto para poder atrapar y manejar la excepción.
De acuerdo con lo que he leído, parece probable que la biblioteca de terceros esté haciendo sus propios hilos y permita excepciones no detectadas. El comportamiento de .NET 2.0+ permite que estas excepciones maten a toda la aplicación. Soy consciente de AppDomain.CurrentDomain.UnhandledException, pero eso no le permite evitar el cierre de la aplicación.
Como referencia, estoy escribiendo una aplicación de consola en .NET 4.0. ¿Alguien tiene alguna solución / consejo para evitar que estas excepciones maten mi aplicación?
El problema es probablemente que las excepciones lanzadas en los hilos de fondo no se atrapen una vez que salen del proceso de hilos.
Esto parece un duplicado no obvio de ¿Cómo evitar que una excepción en un hilo de fondo termine una aplicación?
Una cosa que podrías ver es el atributo HandleProcessCorruptedStateExceptionsAttribute
.
No sé si este es su problema o no, pero recientemente tuve que usar este atributo en un método que llamaba a una función en un objeto COM de un tercero. Este atributo es nuevo en .net 4.0. Mi entendimiento básico es que el marco 4.0 no generará una excepción lanzada en ciertas situaciones donde se siente que la excepción de terceros puede haber introducido cierta inestabilidad. Creo que esto se refiere principalmente a situaciones en las que el componente de terceros no está administrado. No estoy seguro, pero resolvió mi problema.
El uso se ve así:
[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute()]
private void ThirdPartyCall()
{
try
{
return Call3rdPartyFunction()
}
catch (Exception exInstantiate)
{
...
}
}
Más información: http://msdn.microsoft.com/en-us/magazine/dd419661.aspx