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

时间:2020-03-06 14:30:08  来源:igfitidea点击:

我正在寻找一种更好的解决方案,而不是在不重新设计轮子的情况下解决当前的意外生产错误。

我们的更多产品是安装在远程站点的WinForm和WPF应用程序。不可避免地会发生意外错误,从NullReferenceExceptions到"常规网络错误"。因此,从程序员错误到环境问题,不一而足。

当前,所有这些未处理的异常都使用log4net记录,然后通过电子邮件发送给我们进行分析。但是,我们发现有时这些错误"报告"包含的信息太少,无法识别问题。

在这些报告中,我们需要以下信息:

  • 应用名称
  • 应用版本
  • 工作站
  • 也许是屏幕截图
  • 例外详情
  • 操作系统
  • 可用RAM
  • 运行过程
  • 等等...

我真的不想通过从头开始进行开发来重新发明轮子。所需的组件:

  • 错误收集(如上所述)
  • 错误"发件人"(如果数据库或者Internet不可用,则需要排队)
  • 错误数据库
  • 分析和报告这些错误。例如。 10个最常见的错误或者超时发生在4:00 PM和5:00 PM之间。错误如何比较版本x和y?

笔记:
我们将SmartAssembly视为一种可能的解决方案,但尽管接近时仍无法完全满足我们的需求,但我希望听听其他开发人员的工作以及是否存在一些替代方案。

编辑:感谢到目前为止的答案。也许我在最初的问题中并不清楚,问题不在于如何捕获所有未处理的异常,而是如何处理它们并围绕它们创建报告引擎(分析)。

解决方案

我建议杰夫·阿特伍德(Jeff Atwood)撰写有关用户友好的异常处理的文章,该文章可以完成我们已经要求的大部分内容(应用程序信息,屏幕截图,异常详细信息,操作系统,登录到文本文件和通过电子邮件发送),并包含源代码,因此我们可以添加其他内容我们需要的东西。

我们可以添加到未处理的异常事件并对其进行记录/单击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未处理的异常

除了自己处理之外,没有一种可重复使用的通用方法,它确实需要与应用程序的界面正确集成,但是我们可以设置一个使用应用程序名称,异常和所有这些好东西,并为所有应用程序提供一个集中点。

我们可能需要研究JetBrain的Omea Reader中内置的错误报告功能。它具有一个包罗万象的错误处理组件,在发生意外错误时会弹出一个对话框。用户可以在将问题提交给JetBrain的公共错误收集Web服务之前输入更多详细信息。

他们将Omea开源,以允许社区将.NET 1.1代码库升级到v2或者3.
http://www.jetbrains.net/confluence/display/OMEA/this+link