异常处理是一件大事,为此设计一个好的策略并不简单。
首先,一些一般规则:
- 当正在运行的代码完全无法继续运行时会发生异常,因此它可能尝试处理一些内部异常但最终失败。想想 TCP 连接:如果一个损坏的数据包到达,这是一个异常,但 TCP 协议可以处理它。如果损坏太多,则会抛出 I/O 或套接字异常
- 不能总是处理异常。在几乎所有情况下,当您从底层获得异常时,您将无法运行纠正代码。如果您的应用程序依赖于一个数据库并且该数据库处于脱机状态,那么当您收到有关它的异常时,您只能显示一条错误消息
- 异常可能是意料之外的,并且会暴露设计或实施缺陷。例如,实现缺陷可能是您有一个冗余数据库,但当您无法连接到第一个镜像时,您不会尝试第二个
对于第三点,记录异常并定期分析日志以发现任何异常情况很重要。那么,让我们从具体的答案开始吧。
首先
考虑“处理”异常。当您编写每一行代码时,请考虑可能导致其无法完成的问题,并考虑可能的纠正措施。如果有可能的话。错误信息不是很好的处理方式,这是最新的策略。
不要开始写try-catch(Exception),而是更喜欢特定的异常。如果您需要将字符串解析为数字等,请期待FormatException,如果您需要将Object 转换为您的类型,请期待InvalidCastException
当你写低层时
不要犹豫抛出异常!不要像许多人那样做,即。 return null 或使用(如 ANSI C)布尔返回值和引用参数。有例外。如果你可以处理异常(即你没有找到本地文件但你知道你有一个远程备份,所以通过调用远程镜像来处理FileNotFoundException,但如果你仍然不能连接那么最终抛出)然后这样做并尝试恢复计算,但如果你不能然后抛出。并且不要忘记抛出内部异常(如果存在),因为它有助于登录最高层。
基本上,即使您没有捕获任何异常,您仍然可以自行决定抛出异常!强烈建议这样做,尤其是在函数参数无效时!
另一个不错的选择是仍然登录底层。无论发生异常,您实际上都想记录。
当您登录时
记得给消息提供足够的严重性。如果您通过代码发现您的数据库处于脱机状态,这并非意外异常。仍然将其记录为错误,但在调查日志时不要担心代码错误。相反,如果您捕获到您的代码无法识别的异常(NullReferenceException 是一个经典示例),则以最高严重性记录,即。致命的,给予它最高优先级!
ASP.NET 的好策略
当然可以基于Page.OnError 方法。如果您的站点的所有页面都有一个基页面类,那么您绝对应该重写该方法。在该方法中,您应该首先记录您的异常。
你也不应该滥用 try-catch(Exception) 块,因为如果你没有捕捉到你不能用 catch 处理的异常,你将必须通过 OnError 来处理它.
当你运行这样的方法时,不要马上想到Server.RemoveError()。您可以更喜欢为 HTTP 500 错误(当未处理的异常冒泡到 ASP.NET 运行时触发)的静态 HTML 页面,向用户显示礼貌消息。
简述
- 如果发生任何奇怪的事情,请不要犹豫在底层
throw
- 正如您的建议所说,不要处理您无法处理的异常(如果您捕获到您无法处理的异常,请重新抛出它)
- 记录!!!!!!!!!!!!!!!!!!
- 不要在公共网站上向最终用户透露异常详细信息,千万不要!默认情况下,ASP.NET 会阻止这种情况发生,但您仍然可以使用 OnError 打印堆栈跟踪
- 使用
OnError或Application_Error作为单一中心点来处理所有意外异常
- 根据错误/致命消息定期检查日志以发现代码问题,然后考虑维护/调试/修复它