处理非托管代码未明确抛出的访问冲突异常
Handle Access Violation Exception that is not explicitly thrown by unmanaged code
我知道 Access Violation Exception
是一个严重的问题,我不应该真正尝试处理。
我也知道在最新版本的 .Net 中,可以通过
处理此异常
- 将此
<legacyCorruptedStateExceptionsPolicy enabled="true">
放入配置中,所有 catch
块将能够捕获错误
- 用
HandleProcessCorruptedStateExceptions
属性修饰要捕获这些异常的方法
其实this说的很清楚
但我的情况有点不同,我似乎找不到解决方案:
我正在使用一个非托管 C++ 库,我将在我的应用程序的某个时刻初始化它。然后这个dll本身会自己执行一些任务(从服务器拉取数据到缓存,日志记录等)这个Access Violation Exception看起来是在这个过程中抛出的,而不是当appication直接调用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
表示出现严重问题,需要修复。不建议在出现此类错误后继续 运行ning,因为您无法确定进程的状态,如果您尝试继续,可能会导致更严重的错误。如果这是在由第三方代码启动的线程上引发的,据我所知,您几乎无能为力。我不确定为什么你认为它没有看起来那么糟糕,但我会非常小心地处理它。
如果您无法访问第三方代码,最好的解决方案可能是联系作者并解决问题。第二好的解决方案可能是 运行 第三方代码在一个单独的进程中。这样您就可以确保您的进程在代码崩溃时不会受到损害。
我知道 Access Violation Exception
是一个严重的问题,我不应该真正尝试处理。
我也知道在最新版本的 .Net 中,可以通过
- 将此
<legacyCorruptedStateExceptionsPolicy enabled="true">
放入配置中,所有catch
块将能够捕获错误 - 用
HandleProcessCorruptedStateExceptions
属性修饰要捕获这些异常的方法
其实this说的很清楚
但我的情况有点不同,我似乎找不到解决方案:
我正在使用一个非托管 C++ 库,我将在我的应用程序的某个时刻初始化它。然后这个dll本身会自己执行一些任务(从服务器拉取数据到缓存,日志记录等)这个Access Violation Exception看起来是在这个过程中抛出的,而不是当appication直接调用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
表示出现严重问题,需要修复。不建议在出现此类错误后继续 运行ning,因为您无法确定进程的状态,如果您尝试继续,可能会导致更严重的错误。如果这是在由第三方代码启动的线程上引发的,据我所知,您几乎无能为力。我不确定为什么你认为它没有看起来那么糟糕,但我会非常小心地处理它。
如果您无法访问第三方代码,最好的解决方案可能是联系作者并解决问题。第二好的解决方案可能是 运行 第三方代码在一个单独的进程中。这样您就可以确保您的进程在代码崩溃时不会受到损害。