如何解决处理非托管代码未显式抛出的访问冲突异常
我知道 Access Violation Exception
是一个严重的问题,我不应该真正尝试处理。
我也知道在最新版本的.Net中,可以通过
- 将此
<legacyCorruptedStateExceptionsPolicy enabled="true">
放在配置中,所有catch
块都将能够捕获错误 - 使用
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
表示出现严重错误,需要修复。不建议在出现此类错误后继续运行,因为您无法确定进程的状态,并且如果您尝试继续,可能会导致更严重的错误。如果这是在由第三方代码启动的线程上抛出的,据我所知,您几乎无法捕获它。我不知道为什么你认为它没有看起来那么糟糕,但我会非常小心地处理它。
如果您无法访问第三方代码,最好的解决方案可能是联系作者并解决问题。第二个最佳解决方案可能是在单独的进程中运行第三方代码。这样您就可以确保在代码崩溃时您的进程不会受到损害。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。