我承认:我不关心太多的异常处理。我知道我应该做得更多,但我永远不知道从哪里开始和从哪里停止。我并不懒惰。离得很远。这是因为我对异常处理的矛盾心理感到过度紧张。即使是最小的应用程序中,似乎也有无数个地方可以应用异常处理,但它可能会让人感觉有点矫枉过正。

我已经通过仔细的测试、验证和默默的祈祷度过了难关,但这是一个即将发生的糟糕的编程事故。

那么,您的异常处理最佳实践是什么?特别是,哪里是最明显/最关键的地方应该应用异常处理,哪里应该考虑异常处理?

抱歉这个问题含糊不清,但我真的想一劳永逸地结束这本书。

有帮助吗?

解决方案

微软的 模式与实践团队 很好地将异常管理的最佳实践纳入企业库 异常处理应用程序块

事件如果不会使用企业库,我 高度 建议您阅读他们的文档。P&P 团队描述了异常处理的常见场景和最佳实践。

为了帮助您入门,我建议您阅读以下文章:

ASP.NET具体文章:

其他提示

异常处理的黄金法则是:

“只抓住你知道如何处理的东西”

我见过太多的 try-catch 块,其中 catch 除了重新抛出异常之外什么也不做。这没有增加任何价值。仅仅因为您调用可能引发异常的方法并不意味着您必须处理调用代码中可能出现的异常。让异常沿着调用堆栈传播到确实知道要做什么的其他代码通常是完全可以接受的。在某些情况下,让异常一直传播到用户界面层然后捕获并向用户显示消息是有效的。可能没有任何代码最适合知道如何处理这种情况,并且用户必须决定操作过程。

我建议您首先添加一个好的错误页面来捕获所有异常并向用户打印一条稍微不那么不友好的消息。请务必记录异常的所有可用详细信息并进行修改。让用户知道您已经完成了此操作,并给他一个返回(可能)有效的页面的链接。

现在,使用该日志来检测应在何处进行特殊异常处理。请记住,捕获异常是没有用的,除非您打算对其执行某些操作。如果您已准备好上述页面,则在所有数据库操作上单独捕获数据库异常是没有用的,除非您有某种特定的方法在该特定点进行恢复。

记住:比不捕获异常更糟糕的唯一事情是捕获异常但不执行任何操作。这只会掩盖真正的问题。

可能更多的是关于一般的异常处理而不是 ASP.NET 特定的异常处理,但是:

  • 尝试捕获尽可能靠近原因的异常,以便您可以记录(日志)有关异常的信息。
  • 在您的程序的入口点上包括某种形式的捕捉所有,最后一个度假胜地的异常处理程序。在ASP.NET中,这可能是应用程序级别错误处理程序。
  • 如果您不知道如何“正确”处理异常,请让它冒泡到捕获所有处理程序,您可以将其视为“意外”异常。
  • 使用.NET中的尝试*****方法来访问字典之类的内容。如果您在循环中抛出多个异常,这有助于避免重大的性能问题(例外处理相对较慢)。
  • 不要使用异常处理来控制程序的正常逻辑,例如通过投掷声明从循环退出。

从全局异常处理程序开始,例如 http://code.google.com/p/elmah/.

那么问题就归结为你正在编写什么样的应用程序以及你需要提供什么样的用户体验。用户体验越丰富,您就越需要提供更好的异常处理。

例如,考虑一个具有磁盘配额、文件大小限制、图像尺寸限制等的照片托管网站。对于每个错误,您可以简单地返回“发生错误。请再试一次”。或者您可以了解详细的错误处理:

  • “你的文件太大了。最大文件是5MB。”
  • “您的图像很大。最大尺寸为1200x1200。”
  • “你的相册已满。最大存储容量为 1GB”。
  • “您的上传存在错误。我们的仓鼠不高兴。请待会再过来。”

ETC。ETC。

异常处理没有一种万能的方法。

在非常基础的层面上,您应该在 Global.asax 文件中处理 HttpApplication.Error 事件。这应该将发生的任何异常记录到一个位置,以便您可以查看异常的堆栈跟踪。

除了这个基本级别之外,理想情况下,您应该处理您知道可以从中恢复的异常 - 例如,如果您预计文件可能被锁定,那么处理 IOException 并将错误报告给用户将是一个好主意。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top