代码之家  ›  专栏  ›  技术社区  ›  Philip Fourie

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

  •  6
  • Philip Fourie  · 技术社区  · 17 年前

    我正在寻找一个比我们目前必须处理的更好的解决方案 意外的生产错误 不需要重新改造轮子。

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

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

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

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

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

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

    注: 我们看着 SmartAssembly 作为一个可能的解决方案,但虽然接近,它并没有完全满足我们的需要,我希望听到其他开发人员做什么,如果有的替代方案存在。

    编辑: 谢谢你的回答。也许我在最初的问题中不清楚,问题不在于如何捕获所有未散开的异常,而在于如何处理它们并在它们周围创建一个报告引擎(分析)。

    3 回复  |  直到 17 年前
        1
  •  5
  •   jitbit    17 年前

    我建议杰夫·阿特伍德写一篇关于 User Friendly Exception Handling 它完成了你已经询问的大部分内容(应用程序信息、屏幕截图、异常详细信息、操作系统、登录到文本文件和发送电子邮件),并且包含了源代码,因此你可以添加你需要的额外内容。

        2
  •  2
  •   sontek    17 年前

    您可以附加到未处理的异常事件,并记录它/命中Web服务/etc。

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

    我还发现了使用appdomain而不是threadeexception的代码片段:

    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

    除了自己处理之外,没有一种真正通用的方法可以重复使用,它确实需要与应用程序的接口正确集成,但是您可以设置一个WebService,它采用应用程序名、异常和所有好东西,并为所有应用程序都有一个集中点。

        3
  •  0
  •   icelava    17 年前

    您可能需要学习Jetbrain中内置的错误报告功能 Omea Reader . 它有一个catch all错误处理组件,在发生意外错误时弹出对话框。用户可以在将问题提交到Jetbrain的公共错误收集Web服务之前输入更多详细信息。

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