提问人:Philip Fourie 提问时间:9/21/2008 最后编辑:sontekPhilip Fourie 更新时间:9/28/2008 访问量:2467
在 .NET 窗口应用程序中收集/报告意外错误的最佳方法是什么?
What is the best way to collect/report unexpected errors in .NET Window Applications?
问:
我正在寻找一种比我们目前必须处理意外生产错误更好的解决方案,而无需重新发明轮子。
我们的大量产品是安装在远程站点的 WinForm 和 WPF 应用程序。不可避免地会发生意外错误,从 NullReferenceExceptions 到“常规网络错误”。因此,从程序员错误到环境问题。
目前,所有这些未处理的异常都使用 log4net 进行记录,然后通过电子邮件发回给我们进行分析。但是,我们发现有时这些错误“报告”包含的信息太少,无法识别问题。
在这些报告中,我们需要以下信息:
- 应用程序名称
- 应用程序版本
- 工作站
- 也许是屏幕截图
- 异常详细信息
- 操作系统
- 可用 RAM
- 正在运行的进程
- 等等......
我真的不想通过从头开始开发来重新发明轮子。所需的组件:
- 错误收集(详细信息如上所述)
- 错误“sender”(如果数据库或 Internet 不可用,则需要排队)
- 错误数据库
- 分析和报告这些错误。例如,10 个最常见的错误或超时发生在下午 4:00 到 5:00 之间。版本 x 和 y 之间的错误如何比较?
注意: 我们将 SmartAssembly 视为一种可能的解决方案,但尽管很接近,但它并不能完全满足我们的需求,我希望听听其他开发人员在做什么,以及是否存在一些替代方案。
编辑:感谢您到目前为止的回答。也许我最初的问题并不清楚,问题不在于如何捕获所有未经处理的异常,而在于如何处理它们并围绕它们创建报告引擎(分析)。
答:
我推荐 Jeff Atwood 关于用户友好异常处理的文章,它已经完成了您已经询问的大部分内容(应用程序信息、屏幕截图、异常详细信息、操作系统、日志记录到文本文件和电子邮件),并包含源代码,以便您添加所需的额外内容。
评论
您可以附加到未处理的异常事件并记录它/命中 Web 服务/等。
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException);
Application.Run(new FormStartUp());
}
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t)
{
// Log
}
我还发现了使用 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 未处理的异常
除了自己处理它之外,实际上没有一种可重用的通用方法可以做到这一点,它确实需要与应用程序的接口正确集成,但您可以设置一个 Web 服务,它采用应用程序名称、异常和所有好东西,并为所有应用程序提供一个集中点。
您可能想研究 JetBrain 的 Omea Reader 中内置的错误报告功能。它有一个捕获所有错误处理组件,当发生意外错误时会弹出一个对话框。用户可以在将问题提交到 JetBrain 的公共错误收集 Web 服务之前输入更多详细信息。
他们使 Omea 开源,以允许社区将 .NET 1.1 代码库升级到 v2 或 3。http://www.jetbrains.net/confluence/display/OMEA/this+link
评论