.NET“向 [我] 发送错误报告”
Posted
技术标签:
【中文标题】.NET“向 [我] 发送错误报告”【英文标题】:.NET "Send error report to [me]" 【发布时间】:2010-11-14 01:18:09 【问题描述】:如果异常一直传播到我的应用程序的顶部(当然,这永远不会发生),我想提供在程序崩溃之前向我发送错误报告的选项。我的想法是将 Main 函数中的所有内容都包装在一个 try-catch 中,以及一个将堆栈跟踪和其他信息发送到我的服务器的小类。这听起来很简单,但对于这样的事情,我确信存在一些我没有充分考虑的障碍(例如安全性、面向未来)。
是否有用于此目的的现有 .NET 库/项目?或者,这听起来像是正确的方法吗,只是在应用程序的入口点捕获所有异常?
【问题讨论】:
你仍然无法捕捉其他线程抛出的异常:) 还有无法捕获的异常;即 ***Exception ;) “如果异常一直传播到我的应用程序的顶部(当然,这永远不会发生)......”你忘了添加笑脸让我们知道你'再开玩笑。 :) 毫不夸张地说,所有应用都会崩溃。 Wilhelm,***Exception 非常容易捕捉。它只是没有得到堆栈跟踪。 看到这个link [1]:***.com/questions/49224/… 【参考方案1】:请参阅this question 了解 .NET 中所有可用的日志框架,其中任何一个都应提供电子邮件通知。
我认为拥有一个***异常处理程序来收集和记录有关未捕获异常的数据是一种最佳做法。正如 Meeh 在他对您的问题的评论中提到的那样,您的应用中的每个线程都需要一个。
在 FogBugz 的错误报告功能上有一个old article from Joel,也许这会给你更多的想法。 (我想我是在他的博客上读到的,但我能找到的只是 FogBugz 文档中的这个页面)。
【讨论】:
该链接不再有效。我从事以下开源项目,该项目在收集和报告异常方面做得非常出色 (github.com/exceptionless/Exceptionless)【参考方案2】:您可以使用Enterprise Library 中的Logging Application block 在捕获和记录异常时轻松发送电子邮件。以下是有关如何create a last chance exception handler 的一些信息。我假设您有一个 Winform 应用程序,但您的问题并不清楚。
【讨论】:
【参考方案3】:使用与 Windows 相同的工具:Windows Error Reporting (WER)。它将进行崩溃分析并将您的崩溃分类,以便您了解哪些是最常见的。无需更改代码,它适用于流程级别。它将记录您无法捕获的异常的失败。
当然,前提是您在 Windows 上运行。
【讨论】:
不确定 OP 是什么意思。 WER 将错误报告发送到存储它们的微软。开发人员可以定期检索它们进行分析。一个要求是开发人员在微软注册并提供数字签名以识别他的代码,成本为数百美元。更多信息:en.wikipedia.org/wiki/Windows_Error_Reporting【参考方案4】:我的标准免责声明:我是该产品的开发人员。
使用我工作的公司编写的产品(运行时智能)(PreEmptive 解决方案),您不仅可以注入错误报告,还可以通过最少的编码来跟踪用户何时使用您的应用程序以及他们正在使用哪些功能。
使用 Dotfuscator 执行代码注入(或 IL 编织),我们将新代码插入到您的应用程序二进制文件中,将使用数据发送回我们设施托管的服务器(或可选地发送到任何其他任意 URL)。如果您将数据发送给我们,我们会为您提供许多强大的分析工具和使用情况报告。
此功能的基本版本将包含在 Visual Studio 2010 中,并且可以访问免费的数据报告门户(但没有 SLA、数据保留保证或数据隐私)。
将任意数据与使用信息一起发回的能力仅限于商业产品,但您可以联系 PreEmptive Solutions 以获得功能齐全、免费时间有限的评估版本。
您可以使用下面的示例代码完成错误报告:
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;
【讨论】:
【参考方案5】:我从事开源项目 Exceptionless 的工作,该项目的客户端库就是这样做的!我们捕获所有未处理的异常并将它们发送到一个rest api,然后实时处理它们。
https://github.com/exceptionless/Exceptionless
【讨论】:
【参考方案6】:我修改了 Jeff 的 User-Friendly Exception Handler 并将其更新为 .NET 2.0/3.5,我很幸运。如果异常导致堆栈一直未处理,则会截取屏幕截图并将详细的堆栈跟踪通过电子邮件发送给开发团队。
【讨论】:
【参考方案7】:如果您正在开发 ASP.NET 应用程序,您还可以使用 ASP.NET 运行状况监视功能。涉及在配置文件中添加几行,然后你就走了。 http://msdn.microsoft.com/en-us/library/bb398933.aspx
【讨论】:
以上是关于.NET“向 [我] 发送错误报告”的主要内容,如果未能解决你的问题,请参考以下文章
如何对事件日志中的 .NET 2.0 错误报告消息进行故障排除?
ASP.Net 页面调用报告服务 Web 服务得到“401 Unauthorized”错误