防止来自第三方组件的异常导致整个应用程序崩溃

本文关键字:崩溃 应用程序 异常 第三方 组件 | 更新日期: 2023-09-27 17:58:02

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

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

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

防止来自第三方组件的异常导致整个应用程序崩溃

您可能会看到HandleProcessCorruptedStateExceptionsAttribute属性。

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

用法如下:

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

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

问题可能是,在后台线程上抛出的异常一旦从线程进程中冒出,就不会被捕获。

这似乎是"如何防止后台线程中的异常终止应用程序?"的一个不明显的重复?

您可以通过以下操作停止应用程序崩溃:

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

但3d party组件的未捕获异常意味着组件不能正常工作。如果你不在乎他们是否不做这项工作,最好不要使用他们。