【问题标题】:Prevent app from crashing防止应用崩溃
【发布时间】:2018-02-28 13:20:36
【问题描述】:

我有一个 C# WPF 应用程序,它抛出以下错误消息并崩溃:

System.AccessViolationException:试图读或写保护 记忆。这通常表明其他内存已损坏。

然后我在代码中添加了以下异常处理程序。并且还在抛出上述异常的方法的开头添加了以下代码行。

throw new System.AccessViolationException();

当发生上述异常时,现在在我的本地计算机上单击应用程序 exe 时会执行异常处理程序,但应用程序仍然崩溃。我需要能够防止应用程序崩溃。不知道该怎么做?

application.DispatcherUnhandledException += ApplicationDispatcherUnhandledException;

TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;


AppDomain currentAppDomain = AppDomain.CurrentDomain;
currentAppDomain.UnhandledException += new UnhandledExceptionEventHandler
                        (UnhandledExceptionHandler);

谢谢。

【问题讨论】:

  • 通过修复访问冲突。
  • 异常的堆栈跟踪肯定会告诉您在哪里发生异常。检查该代码,您显然做错了什么会破坏您的记忆(可能是一些本机或 p/invoke 调用)。尝试解决这个问题。如果没有看到 (relevant) 代码,我们无法判断您做错了什么。
  • 你不想让它崩溃,用try catch包裹它,但它仍然不能解决你的问题。
  • 可以显示ApplicationDispatcherUnhandledException的内容吗?

标签: c# wpf exception exception-handling


【解决方案1】:

您需要确定代码的哪一部分引发了该异常。我敢打赌它是一些外部未管理的库。

如果您无法修复该库,您可以按照 MSDN 上的说明进行操作:

AccessViolationException

AccessViolationException 和 try/catch 块

从 .NET Framework 4 开始,AccessViolationException 公共语言运行时抛出的异常不被处理 如果异常,结构化异常处理程序中的 catch 语句 发生在公共语言运行库保留的内存之外。 要处理这样的 AccessViolationException 异常,您应该申请 HandleProcessCorruptedStateExceptionsAttribute 属性 抛出异常的方法。此更改不影响 用户代码抛出的 AccessViolationException 异常,可以 继续被 catch 语句捕获。对于编写的代码 您要重新编译的 .NET Framework 的早期版本和 在 .NET Framework 4 上无需修改即可运行,您可以添加 应用程序的元素 配置文件。请注意,您还可以收到通知 如果您已为 AppDomain.FirstChanceException 或 AppDomain.UnhandledException 事件。

【讨论】:

  • 谢谢。这样可以防止应用崩溃吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多