如果异常一直传播到我的应用程序的顶部(当然,这永远不会发生),我想提供在程序崩溃之前向我发送错误报告的选项。我的想法是将 Main 函数中的所有内容都包装在一个 try-catch 中,以及一个将堆栈跟踪和其他信息发送到我的服务器的小类。这听起来很简单,但是对于这样的事情,我确信存在一些我没有充分考虑的障碍(例如安全性、面向未来的)。
是否有用于此目的的现有 .NET 库/项目?或者,这听起来像正确的方法吗,只是在应用程序的入口点捕获所有异常?
如果异常一直传播到我的应用程序的顶部(当然,这永远不会发生),我想提供在程序崩溃之前向我发送错误报告的选项。我的想法是将 Main 函数中的所有内容都包装在一个 try-catch 中,以及一个将堆栈跟踪和其他信息发送到我的服务器的小类。这听起来很简单,但是对于这样的事情,我确信存在一些我没有充分考虑的障碍(例如安全性、面向未来的)。
是否有用于此目的的现有 .NET 库/项目?或者,这听起来像正确的方法吗,只是在应用程序的入口点捕获所有异常?
在 .NET 中所有可用的日志框架上查看这个问题,它们中的任何一个都应该提供电子邮件通知。
我认为拥有一个顶级异常处理程序来收集和记录未捕获异常的数据是一种最佳实践。正如 Meeh 在他对您的问题的评论中提到的那样,您的应用程序中的每个线程都需要一个。
Joel有一篇关于 FogBugz 的错误报告功能的旧文章,也许会给你更多的想法。(我想我是在他的博客上读到的,但我能找到的只是这个来自 FogBugz 文档的页面)。
您可以使用Enterprise Library中的Logging Application 块在捕获和记录异常时轻松发送电子邮件。以下是有关如何创建最后机会异常处理程序的一些信息。我假设您有一个 Winform 应用程序,但您的问题并不清楚。
使用 Windows 使用的相同工具:Windows 错误报告(WER)。它将进行崩溃分析并将您的崩溃分类,以便您了解哪些是最常见的。无需更改代码,它适用于流程级别。它将记录您无法捕获的异常的失败。
当然,所有这些都假设您在 Windows 上运行。
我的标准免责声明:我是该产品的开发人员。
使用由我工作的公司(PreEmptive Solutions)编写的产品(运行时智能),您不仅可以注入错误报告,还可以跟踪用户何时使用您的应用程序以及他们使用最少的编码使用哪些功能。
使用 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;
}
}
我在开源项目 Exceptionless 上工作,它的客户端库就是这样做的!我们捕获所有未处理的异常并将它们发送到一个 rest api,然后实时处理它们。
我修改了 Jeff 的User-Friendly Exception Handler并为 .NET 2.0/3.5 更新了它,而且我很幸运。如果异常导致堆栈一直未处理,则会截取屏幕截图并将详细的堆栈跟踪通过电子邮件发送给开发团队。
如果您正在处理 ASP.NET 应用程序,您还可以使用 ASP.NET 运行状况监视功能。涉及在配置文件中添加几行,然后你就走了。 http://msdn.microsoft.com/en-us/library/bb398933.aspx