防止第三方组件的exception崩溃整个应用程序

我正在编写一个依赖于某些第三方DLL的multithreading应用程序。 我的问题是,当使用第三方库中的对象时,如果它在运行时引发exception,我无法捕获它并且它会冒泡并杀死整个应用程序。 我有许多不同的线程,每个线程使用来自此第三方库的自己的对象,我需要使用该对象副本的线程能够捕获并处理exception。

根据我所读到的内容,似乎第三方库实际上是在制作自己的线程并允许未捕获的exception。 .NET 2.0+行为允许这些exception终止整个应用程序。 我知道AppDomain.CurrentDomain.UnhandledException,但这不允许您阻止应用程序关闭。

作为参考,我正在.NET 4.0中编写一个控制台应用程序。 有没有人有任何解决方案/建议来阻止这些exception杀死我的应用程序?

您可能会关注的一件事是HandleProcessCorruptedStateExceptionsAttribute属性。

我不知道这是不是你的问题,但最近我不得不在一个调用第三方COM对象中的函数的方法上使用这个属性。 此属性是.net 4.0的新属性。 我的基本理解是4.0框架默认情况下不会冒出在某些情况下抛出的exception,在这种情况下,它感觉第三方exception可能引入了一些不稳定性。 我认为这主要适用于第三方组件未受管理的情况。 我不确定,但它解决了我的问题。

用法如下:

 [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute()] private void ThirdPartyCall() { try { return Call3rdPartyFunction() } catch (Exception exInstantiate) { ... } } 

更多信息: http : //msdn.microsoft.com/en-us/magazine/dd419661.aspx

问题可能是,一旦它们冒出线程proc,就不会捕获在后台线程上抛出的exception。

这似乎是一个非显而易见的重复如何防止后台线程中的exception终止应用程序?

您可以通过这样做来停止应用程序崩溃:

  AppDomain.CurrentDomain.UnhandledException += (sender, e2) => { Thread.CurrentThread.Join(); }; 

但是,来自3d party组件的未被捕获的exception意味着组件无法正常工作。 如果你不在乎他们是否做得更好,就不要使用它们。