自动错误处理






4.78/5 (8投票s)
自动处理 Web 和 WinForms 异常。
引言
微软关于错误处理的最佳实践[1]非常明确。它们旨在避免丢失可能对开发人员有用的信息,提供合理的用户体验,并防止每次出现问题时对性能产生巨大影响。
因此,您已经按照最佳实践,将异常处理程序排列整齐。在不可避免发生错误的情况下,您的应用程序将在一个或多个级别上正确处理该异常。
会是这样吗? 发生在您的代码之外的异常呢? 显而易见的答案是未处理的异常处理程序,但编写这些处理程序可能是一项棘手的工作,因为那里的任何问题都会使您的应用程序戛然而止。
并且,一旦您在某种处理程序中获得异常,那又该怎么办? 显然,您不希望精心设计的错误信息简单地落入垃圾箱。依靠用户告诉您异常调用堆栈不是一个好主意。
背景
我没有重新创建已被编写无数次的东西,而是决定四处看看已经完成了什么。 就像许多企业、系统或应用程序方面一样,无论软件的用途如何,错误处理和报告都会做相当常见的事情。 在搜索其他内容时,我偶然发现了 Jeff Atwood 关于异常处理的博客 [2] 条目。
Atwood 的示例是 VB。 我的大部分工作都是用 C# 完成的,所以在审查代码时,我将其翻译成 C#。 我还提出了一些改进方法来添加到其中
- 我没有配置将错误记录到哪些目标,而是添加了一个回退算法。 记录到数据库具有优先级,但如果失败,则本地事件日志是备份。 如果失败,则保存到本地文件是最后的手段。 错误始终通过电子邮件发送。
- 单独的 Web 窗体和 Windows 窗体库可以轻松组合。 我还将其集成到一个通用实用程序库中,提供我经常在一个项目中寻找的所有额外功能。 将通用方法移动到通用基类有助于维护。
- 一些内部回退异常处理程序在记录辅助错误方面不是很有用,并且事件处理结果并不总是得到很好的处理。 我调整了两者的设置,以提供更多信息。
- 漂亮的调用堆栈格式以 VB 格式显示参数。 为了保持一致,我将其更改为 C# 语法。
- SMTP 电子邮件处理类已添加到 2.0 版的框架中。 我用框架类替换了手工创建的类。 我还查找了使用 Gmail 发送警报的设置。 这在最初设置应用程序时非常方便,而您的客户端尚未启动并运行他们的服务器。
- 有时应用程序可以处理异常,但您希望记录问题以供以后分析。 我添加了一个重载,允许错误处理和日志记录,而不会中断用户或停止应用程序。
与企业方面的集成非常简单。 事实上,拥有一个用于配置、日志记录和数据库访问的框架使得日志记录到数据库非常容易。
使用代码
提供的解决方案包括四个项目。 其中三个是控制台、Web 和 Windows 窗体应用程序中使用的示例。 第四个是错误处理程序库本身。
控制台和 Windows 窗体应用程序的关键是注册未处理的异常事件委托。 这在一个简单的方法调用中处理
ErrorHandler.ExceptionHandler.AddHandler( true, true, true );
参数确定未处理异常的默认行为。
脚注
- MSDN:处理异常的最佳实践
- www.codinghorror.com
- 原始文章可以在 Jeff Atwood 的帖子 - 用户友好的异常处理 下找到