在.NET窗体应用程序中,收集/报告意外错误的最佳方法是什么?

6
我正在寻找比我们目前使用的更好的解决方案来处理意外的生产错误,而不需要重新发明轮子。
我们的许多产品都是WinForm和WPF应用程序,安装在远程站点。不可避免地会出现意外错误,从NullReferenceExceptions到“一般网络错误”。因此,从程序员错误到环境问题都有可能。
目前,所有这些未处理的异常都使用log4net进行记录,然后通过电子邮件发送给我们进行分析。然而,我们发现有时这些错误“报告”包含的信息太少,无法识别问题。
在这些报告中,我们需要的信息包括:
  1. 应用程序名称
  2. 应用程序版本
  3. 工作站
  4. 可能是屏幕截图
  5. 异常详细信息
  6. 操作系统
  7. 可用RAM
  8. 运行进程
  9. 等等...
我不想重新发明轮子来从头开始开发这个。所需组件包括:
  1. 错误收集(详见上文)
  2. 发送者错误(如果数据库或互联网不可用,则需要排队)
  3. 错误数据库
  4. 分析和报告这些错误。例如:在下午4:00至5:00之间,最常见的10个错误或超时是什么?版本x和y之间的错误有何区别?

注意: 我们曾考虑SmartAssembly作为可能的解决方案,但虽然接近但并未完全满足我们的需求,我希望听听其他开发人员做了什么以及是否存在一些替代方案。

编辑:谢谢迄今为止的答案。也许我在最初的问题中没有表达清楚,问题不在于如何捕获所有未处理的异常,而在于如何处理它们并创建一个报告引擎(分析)。


你好,我很感兴趣知道是什么原因导致SmartAssembly没有完全满足您的需求? - Mel Harbour
3个回答

5
我建议阅读Jeff Atwood的关于用户友好的异常处理的文章,它已经包含了大部分你所需要的内容(应用程序信息、屏幕截图、异常详情、操作系统、文本文件记录和邮件发送),而且还包含源代码,你可以添加额外需要的内容。

谢谢,这是朝着正确方向迈出的一步。我已经阅读了这篇文章,它提供了解决问题的一部分(收集错误)的方法。正如你所提到的,它需要为我们的特定需求进行调整,但至少它提供了一个起点。我希望还有其他东西可以用来分析这些错误。 - Philip Fourie

2
您可以附加到未处理的异常事件并记录它/命中Web服务等。
[STAThread]
static void Main() 
{
    Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException);
    Application.Run(new FormStartUp());
}
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t) 
{
    // Log
}

我还发现了这段代码片段,它使用的是AppDomain而不是ThreadException:

static class EntryPoint {
    [MTAThread]
    static void Main() {
        // Add Global Exception Handler
        AppDomain.CurrentDomain.UnhandledException += 
            new UnhandledExceptionEventHandler(OnUnhandledException);

        Application.Run(new Form1());
    }

    // In CF case only, ALL unhandled exceptions come here
    private static void OnUnhandledException(Object sender, 
        UnhandledExceptionEventArgs e) {
        Exception ex = e.ExceptionObject as Exception;
        if (ex != null) {
            // Can't imagine e.IsTerminating ever being false
            // or e.ExceptionObject not being an Exception
            SomeClass.SomeStaticHandlingMethod(ex, e.IsTerminating);
        }
    }
}

这里有一些关于它的文档:AppDomain未处理异常 除了自己处理之外,没有真正通用的方法可以重复使用,它确实需要与应用程序的接口正确集成,但您可以设置一个Web服务来接收应用程序名称、异常和所有相关信息,并为所有应用程序提供一个集中点。

0

您可能想研究一下JetBrain的Omea Reader中内置的错误报告功能。它具有全面的错误处理组件,当出现意外错误时会弹出一个对话框。用户可以在提交问题到JetBrain的公共错误收集Web服务之前输入更多细节。

他们开放了Omea的源代码,以便让社区将.NET 1.1代码基升级至v2或3。 http://www.jetbrains.net/confluence/display/OMEA/this+link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接