我正在寻找比我们目前处理意外生产错误更好的解决方案,而无需重新发明轮子。
我们的大量产品是安装在远程站点的WinForm和WPF应用程序。从NullReferenceExceptions到“常规网络错误”,不可避免地会发生意外错误。因此,从程序员错误到环境问题。
目前,使用log4net记录所有这些未处理的异常,然后通过电子邮件发回给我们进行分析。但是我们发现,有时这些错误“报告”包含的信息太少,无法识别问题。
在这些报告中,我们需要以下信息:
我真的不想通过从头开发来重新发明轮子。所需的组件:
注意: 我们将SmartAssembly视为一种可能的解决方案,但尽管接近它并不能完全满足我们的需求,但我希望能够听到其他开发人员的工作以及是否存在其他替代方案。
编辑:感谢您的回答。也许我在原来的问题中并不清楚,问题不在于如何捕获所有无法处理的异常,而是如何处理它们以及围绕它们创建报告引擎(分析)。
答案 0 :(得分:5)
我建议杰夫阿特伍德关于User Friendly Exception Handling的文章,它完成了你所提出的大部分内容(应用程序信息,屏幕截图,异常详细信息,操作系统,记录到文本文件和电子邮件),并包含源代码所以你添加了你需要的额外东西。
答案 1 :(得分:2)
您可以附加到未处理的异常事件并记录/点击webservice / etc。
[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 Unhandled Exception
除了自己处理它之外,实际上没有一种通用的方法可以重用,它确实需要与应用程序的接口正确集成,但是你可以设置一个带有应用程序名称的web服务,异常,以及所有好东西,并为您的所有应用程序提供集中点。
答案 2 :(得分:0)
您可能想要研究JetBrain的Omea Reader内置的错误报告功能。它有一个包含所有错误处理组件,可在发生意外错误时弹出对话框。在将问题提交给JetBrain的公共错误收集Web服务之前,用户可以输入更多详细信息。
他们使Omea开源,允许社区将.NET 1.1代码库升级到v2或3。 http://www.jetbrains.net/confluence/display/OMEA/this+link