.NET“向 [我] 发送错误报告”

.NET "Send error report to [me]"

提问人: 提问时间:7/26/2009 更新时间:12/9/2014 访问量:3107

问:

如果异常一直传播到我的应用程序顶部(当然,这永远不会发生),我想提供在程序崩溃之前向我发送错误报告的选项。我想到的是将 Main 函数中的所有内容包装在一个 try-catch 中,以及一个小类,用于将堆栈跟踪和其他信息发送到我的服务器。这听起来很简单,但对于这样的事情,我确信有一些障碍(例如安全性、面向未来)我没有充分考虑。

是否有用于此目的的现有 .NET 库/项目?或者,这听起来像是正确的方法,只是在应用程序的入口点中捕获所有异常?

.NET 异常 处理 错误报告

评论

0赞 cwap 7/26/2009
捕获其他线程抛出的异常仍然有问题:)
0赞 Wilhelm 7/26/2009
而且还有无法捕捉的摘录;即 StackOverflowException ;)
0赞 Curt Nichols 7/26/2009
“如果异常一直传播到我的应用程序顶部(当然,这永远不会发生)...”你忘了添加一个笑脸,让我们知道你在开玩笑。:)毫不夸张地说,所有应用程序都会崩溃。
0赞 Joshua 10/2/2009
Wilhelm,StackOverflowException 非常容易捕获。它只是没有得到堆栈跟踪。
0赞 Ravi Patel 6/11/2012
请参阅此链接 [1]:stackoverflow.com/questions/49224/...

答:

1赞 JP Alioto 7/26/2009 #1

您可以使用企业库中的“日志记录应用程序”块,在捕获和记录异常时轻松发送电子邮件。下面是有关如何创建最后机会异常处理程序的一些信息。我假设你有一个 Winform 应用程序,但你的问题并不清楚。

3赞 Treb 7/26/2009 #2

请参阅有关 .NET 中所有可用日志记录框架的问题,其中任何一个都应提供电子邮件通知。

我认为最佳做法是拥有一个顶级异常处理程序来收集和记录有关未捕获异常的数据。正如 Meeh 在对你的问题的评论中提到的,你的应用中的每个线程都需要一个。

Joel 有一篇关于 FogBugz 中错误报告功能的旧文章,也许会给你更多的想法。(我想我在他的博客上读过它,但我能找到的只是 FogBugz 文档中的这个页面)。

评论

0赞 Blake Niemyjski 12/9/2014
该链接不再有效。我从事以下开源项目,该项目在收集和报告异常方面做得非常出色(github.com/exceptionless/Exceptionless )
1赞 Curt Nichols 7/26/2009 #3

使用与 Windows 相同的工具:Windows 错误报告 (WER)。它将进行崩溃分析并对您的崩溃进行分类,以便您了解哪些是最常见的。无需更改代码,它在流程级别工作。它将记录无法捕获的异常的故障。

当然,所有这些都假设您在 Windows 上运行。

评论

1赞 urig 1/18/2010
不知道OP是什么意思。WER 将错误报告发送到 Microsoft 并存储这些报告。开发人员可以定期检索它们进行分析。一个要求是开发人员在微软注册并提供数字签名来识别他的代码,费用为数百美元。更多内容请见:en.wikipedia.org/wiki/Windows_Error_Reporting
1赞 Joe Kuemerle 7/26/2009 #4

我的标准免责声明:我是该产品的开发人员。

使用我工作的公司(PreEmptive Soltutions)编写的产品(Runtime Intelligence),您不仅可以注入错误报告,还可以以最少的编码跟踪用户何时使用您的应用程序以及他们正在使用的功能。

使用 Dotfuscator 执行代码注入(或 IL 编织),我们将新代码插入到应用程序二进制文件中,这些二进制文件将使用情况数据发送回托管在我们设施中的服务器(或可选地发送到任何其他任意 URL)。如果您将数据发送给我们,我们将为您提供许多强大的分析工具和使用情况报告。

此功能的基本版本将包含在 Visual Studio 2010 中,并可以访问免费的数据报告门户(但没有 SLA、数据保留保证或数据隐私)。

将任意数据与使用信息一起发回的能力仅限于商业产品,但您可以联系 PreEmptive Soltutions 获取功能齐全、免费限时的评估版本。

您可以使用以下示例代码完成错误报告:

public partial class app : Application {
// field to temporarily store exception data        
    private Exception exp;
    void AppStartup(object sender, StartupEventArgs args) {
        // add a handler to catch any unhandled exceptions    
        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(ErrorHandler); 
        Window1 mainWindow = new Window1();
        mainWindow.ShowDialog();
    }

    // this will prompt the user if they want to report the exception
    void ErrorHandler(object sender, DispatcherUnhandledExceptionEventArgs e) {
        this.exp = e.Exception;
        if (MessageBox.Show("A " + exp.Message + " exception happened, should I report it?", "Error Occurrend", MessageBoxButton.YesNo) == MessageBoxResult.Yes) {
            ErrorHappened();
            e.Handled = true;
        }
    }

    // this method is called by the above ErrorHandler method and when run through Dotfuscator additional code will be injected into this method that will send a usage data message back to the server and the data in the dictionary (which will be exception data) returned by the ErrorData method will be included into the message and be stored and reported on the server
    [Feature("Exception", EventType = FeatureEventTypes.Tick, ExtendedKeySourceElement = SourceElements.Method, ExtendedKeySourceName = "ErrorData")]
    private void ErrorHappened() {
        // This is here as a placeholder for the exception feature attribute which will exit the application when executed
        AppShutdown(true);
    }

    // this method takes the exception data from the exp field and returns it as a dictionary of name/value pairs
    public Dictionary<string, string> ErrorData() {
        var retval = new Dictionary<string,string>();
        if (null != exp) {
            retval.Add("Error Message",exp.Message);
            retval.Add("Stack Trace",exp.StackTrace);
        }
        return retval;
    }
}
0赞 Chris Doggett 7/26/2009 #5

我修改了 Jeff 的用户友好异常处理程序,并针对 .NET 2.0/3.5 对其进行了更新,我很幸运。如果异常导致堆栈一直未处理,则会截取屏幕截图并通过电子邮件将详细的堆栈跟踪发送给开发团队。

0赞 Joshua S. 10/2/2009 #6

如果您正在处理 ASP.NET 应用程序,还可以使用 ASP.NET 运行状况监视功能。涉及向配置文件添加几行,然后你就关闭了。 http://msdn.microsoft.com/en-us/library/bb398933.aspx

1赞 Blake Niemyjski 12/9/2014 #7

我从事开源项目 Exceptionless 的工作,该项目的客户端库可以做到这一点!我们捕获所有未处理的异常,并将它们发送到 rest api,然后实时处理它们。

https://github.com/exceptionless/Exceptionless