WPF应用程序的exception报告

所以假设我碰巧在我的应用程序中有一个未处理的exception,或者由于某种原因它崩溃了。 有什么方法可以捕获输出并在应用程序崩溃时显示错误报告对话框。

我在想的是在后台运行一个小程序,其唯一的工作就是监听主应用程序的exception退出,然后显示“报告”对话框,用户可以选择通过电子邮件向我发送错误输出。

不确定如何实现这一点,或者这是否是正确的方法。

报告错误消息将是一项简单的任务,但我不知道如何捕获未处理exception的输出或获取退出代码(我假设程序在崩溃时会给出除0以外的退出代码)。

在正确的方向上轻推是很棒的。

你最好的机会就在申请中。 有两个钩子:

  • AppDomain.UnhandledException是终极’全能’
  • Application.ThreadException是表单线程中发生的exception的特定于UI的catch-all

“全部捕获”的适当位置取决于您的应用程序语义,很难说您应该在不知道应用程序的情况下放置它。 应用程序还需要设置Application.SetUnhandledExceptionMode

拥有外部看门狗不太有用,因为它无法提供任何有意义的信息,为什么应用程序崩溃。 当它检测到“意外”退出时(它是如何知道“意外”?)为时已晚,无法收集任何有用的信息。 使用内部处理程序,您可以收集exception和堆栈,并将它们提交给像bugcollect.com这样的分析服务,然后您就可以了解现在只发生了什么以及它发生的频率以及受影响的部署(它发生的地方)。 还有其他类似的服务,例如exceptioneer.com或Windows错误报告 (这需要您的代码由Verisign等受信任的授权证书签名)。 依靠收集事件的服务远远优于发送邮件,您不想在收件箱中醒来并发现2k事件电子邮件并开始筛选它们以了解发生的情况。

最后一个世界:不要重新发明轮子:已经有很多框架可以收集和记录exception,比如log4net和elmah 。

您可以使用NBug库(也可以在这里使用nuget包以便于安装)。 只需安装NuGet包并进行如下配置:

 NBug.Settings.Destination1 = "Type=Mail;From=me@mycompany.com;To=bugtracker@mycompany.com;SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.Current.DispatcherUnhandledException += NBug.Handler.DispatcherUnhandledException; 

现在所有未处理的exception都会被很好地捕获并为您提供礼物包装,您将通过电子邮件获得exception的完整详细信息。 使用配置程序工具确保配置正确。

您应该处理Application.ThreadException事件。