防止来自 3rd 方组件的异常使整个应用程序崩溃
Posted
技术标签:
【中文标题】防止来自 3rd 方组件的异常使整个应用程序崩溃【英文标题】:Preventing Exceptions from 3rd party component from crashing the entire application 【发布时间】:2011-09-03 16:50:57 【问题描述】:我正在编写一个依赖于某些第三方 DLL 的多线程应用程序。我的问题是,当使用第三方库中的对象时,如果它在运行时引发异常,我无法捕捉到它,它会冒泡并杀死整个应用程序。我有许多不同的线程,每个线程都使用来自这个第三方库的自己的对象,我需要使用该对象副本的线程能够捕获和处理异常。
根据我读到的内容,第 3 方库似乎很可能实际上是在创建自己的线程并允许未捕获的异常。 .NET 2.0+ 行为允许这些异常终止整个应用程序。我知道 AppDomain.CurrentDomain.UnhandledException,但这不允许您阻止应用程序关闭。
作为参考,我正在.NET 4.0 中编写一个控制台应用程序。有没有人有任何解决方案/建议来阻止这些异常杀死我的应用程序?
【问题讨论】:
如果抓不到异常,怎么知道抛出了异常?可能是 DLL 只是在破坏内存。它是一个 .NET DLL 吗?另外,当这些异常之一发生时,您想做什么?您无法继续,因为您不知道 DLL 的状态。您所能做的就是在终止整个应用程序之前显示一条漂亮的消息。 在同一条船上:使用不捕获异常的 Timer 回调编写糟糕的第 3 方库......结论我们要实现真正的隔离是拥有单独的进程而不是子 AppDomains跨度> 【参考方案1】:您可能会看到HandleProcessCorruptedStateExceptionsAttribute
属性。
我不知道这是否是您的问题,但我最近不得不在调用第三方 COM 对象中的函数的方法上使用此属性。此属性是 .net 4.0 的新属性。我的基本理解是,默认情况下,4.0 框架不会在某些情况下引发异常,因为它认为第 3 方异常可能引入了一些不稳定。我认为这主要与第 3 方组件不受管理的情况有关。我不确定,但它解决了我的问题。
用法如下:
[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute()]
private void ThirdPartyCall()
try
return Call3rdPartyFunction()
catch (Exception exInstantiate)
...
更多信息:http://msdn.microsoft.com/en-us/magazine/dd419661.aspx
【讨论】:
您好,感谢您的回复,但不幸的是我仍然遇到同样的问题。有问题的 DLL 是托管代码,但我无法捕获由此产生的异常。我知道异常来自的实例需要关闭,但在其他实例上运行的应用程序的其余部分不需要关闭。这不是内存不足或任何严重的事情,只是表示脚本错误的异常。如果有帮助,我指的是 Selenium .NET 组件。 @DrSpock - 您正在调用的引发异常的方法,您是从线程中调用的吗?你把它包装在一个try catch中?如果你在 catch 上设置断点,它就永远不会中断? 您好,这三个问题都是肯定的。 谢谢您,先生,我遇到了 AccessViolationException 问题,我无法使用 catch 语句捕获。 docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:问题可能是在后台线程上抛出的异常一旦从线程进程中冒出来就不会被捕获。
这似乎是 How to prevent an exception in a background thread from terminating an application? 的不明显重复
【讨论】:
+1 我同意你关于欺骗的观点。如果有什么事情要让应用程序崩溃,你真的无法阻止它;除非a)代码是固定的或b)你把它从应用程序中删除【参考方案3】:您可以通过这样做来阻止应用程序崩溃:
AppDomain.CurrentDomain.UnhandledException += (sender, e2) =>
Thread.CurrentThread.Join();
;
但是 3d 派对组件未捕获的异常意味着组件无法正常工作。如果您不在乎他们是否做得更好,请不要使用它们。
【讨论】:
以上是关于防止来自 3rd 方组件的异常使整个应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
处理或防止错误使我在 Heroku 上的整个 node.js 应用程序崩溃
OLEDB - C++ - ATL 的 OLEDB 提供程序示例使 Excel 崩溃(来自 msado15.dll 的未捕获异常)