【问题标题】:What is the best way to collect/report unexpected errors in .NET Window Applications?在 .NET 窗口应用程序中收集/报告意外错误的最佳方法是什么?
【发布时间】:2010-09-11 17:58:17
【问题描述】:

我正在寻找一种比我们目前必须处理意外生产错误更好的解决方案,而无需重新发明轮子。

我们的大部分产品是安装在远程站点的 WinForm 和 WPF 应用程序。从 NullReferenceExceptions 到“一般网络错误”,不可避免地会发生意外错误。因此,从程序员错误到环境问题。

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

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

  1. 应用程序名称
  2. 应用版本
  3. 工作站
  4. 可能是屏幕截图
  5. 异常详情
  6. 操作系统
  7. 可用内存
  8. 正在运行的进程
  9. 等等……

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

  1. 错误收集(详情如上所述)
  2. “发件人”错误(如果 DB 或 Internet 不可用,则需要排队)
  3. 错误数据库
  4. 分析和报告这些错误。例如。 10 个最常见的错误或超时发生在下午 4:00 到下午 5:00 之间。版本 x 和 y 之间的错误比较如何?

注意: 我们将SmartAssembly 视为一种可能的解决方案,但尽管很接近,但它并不能完全满足我们的需求,我希望了解其他开发人员的做法以及是否存在其他替代方案。

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

【问题讨论】:

  • 您好,我很想知道 SmartAssembly 不能完全满足您的需求是什么意思?

标签: c# .net error-handling reporting


【解决方案1】:

我建议 Jeff Atwood 在 User Friendly Exception Handling 上的文章,它完成了您已经询问的大部分内容(应用程序信息、屏幕截图、异常详细信息、操作系统、记录到文本文件和电子邮件),并包含源代码,以便您添加你需要的额外的东西。

【讨论】:

  • 感谢这是朝着正确方向迈出的一步。我阅读了这篇文章,它为部分问题(收集错误)提供了解决方案。正如您提到的,它需要为我们的特定需求工作,但至少它提供了一个启动。我希望存在其他东西来分析这些错误。
【解决方案2】:

您可以附加到未处理的异常事件并记录它/点击网络服务/等。

[STAThread]
static void Main() 
{
    Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException);
    Application.Run(new FormStartUp());
}
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t) 
{
    // Log
}

我还发现这段代码 sn-p 使用 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 Unhandled Exception

除了自己处理之外,实际上并没有一种可重用的通用方法,它确实需要与应用程序的接口正确集成,但您可以设置一个采用应用程序名称的 Web 服务,例外,以及所有好东西,并为您的所有应用提供一个集中点。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      相关资源
      最近更新 更多