处理非托管代码未显式抛出的访问冲突异常

问题描述

我知道 Access Violation Exception一个严重的问题,我不应该真正尝试处理。 我也知道在最新版本的.Net中,可以通过

处理这个异常
  1. 将此 <legacyCorruptedStateExceptionsPolicy enabled="true"> 放在配置中,所有 catch 块都将能够捕获错误
  2. 使用 HandleProcessCorruptedStateExceptions 属性修饰您想要捕获这些异常的方法

其实this已经说得很清楚了。

但我的情况有点不同,我似乎找不到解决方案: 我正在使用一个非托管的 C++ 库,我将在我的应用程序的某个时候初始化它。然后这个 dll 本身会自己执行一些任务(从服务器拉数据到缓存,记录等)这个访问冲突异常看起来是在这个过程中抛出的,而不是在应用程序直接调用 dll 的 api 时抛出。所以我无法try catch违反逻辑。

在这个阶段,我已经设法在 AppDomain.CurrentDomain.UnhandledException 中捕捉到它,如下所示:

    [HandleProcessCorruptedStateExceptions,SecurityCritical]
    private static void CurrentDomainUnhandledException(object sender,UnhandledExceptionEventArgs e)
    {
        Logger.Error("Unhandle Exception",(Exception)e.ExceptionObject);
    }

但我仍然无法完全防止应用程序崩溃。 我知道我可能应该让应用程序崩溃。但我真的相信这个错误并不像看起来那么糟糕,我只需要知道如何抑制它,即使我可能不会使用它。

有什么想法吗?

解决方法

Access violation exception 表示出现严重错误,需要修复。不建议在出现此类错误后继续运行,因为您无法确定进程的状态,并且如果您尝试继续,可能会导致更严重的错误。如果这是在由第三方代码启动的线程上抛出的,据我所知,您几乎无法捕获它。我不知道为什么你认为它没有看起来那么糟糕,但我会非常小心地处理它。

如果您无法访问第三方代码,最好的解决方案可能是联系作者并解决问题。第二个最佳解决方案可能是在单独的进程中运行第三方代码。这样您就可以确保在代码崩溃时您的进程不会受到损害。