异常处理实践最高级别与每个功能



我已经看到了几种异常处理方法。我看到的两个最常见的模式是:

  • 尝试捕获每个功能,记录异常并重新rethrow
  • 尝试在最高级别上捕获(例如主函数),记录异常和rethrow

如果有一个更好的做法?或您将选择一种方法而不是彼此?

这取决于您的应用程序,并且是设计选择,尽管选项1非常混乱。您应该只捕获您准备在某种程度上处理的例外,而不是任意捕获每个人。在大多数语言中,例外将有一个堆栈跟踪,您可以在每个级别上进行登录,这是不必要的。当我说以某种方式进行登录和重新恢复的操作,或者可能是记录时,请将某些错误通知用户,然后继续运行

作为旁注,您不应将异常用作代码中的逻辑。如果您发现自己尝试使用捕获块作为流控制,则应该考虑重新设计。例外就是例外。

选项1被视为不良练习,应该避免,选项2是您应该遵循的最佳实践。

异常处理的原则是默认情况下,让异常自然投掷并像选项2一样抓住它们。只有一种情况,您只需要捕获异常即可根据例外进行一些业务逻辑。如果您不处理业务逻辑,请不要捕捉。

选项1的更多缺点:

  1. 很多 try-catch re-throw 使您的代码不那么可读,

  2. 考虑在每种方法中捕获异常并记录它们都会使日志文件日志相同的异常信息。

我大多数时候看到的练习是:

捕获您准备处理的那些例外。例如,插入重复的主键,捕获它,并向用户显示适当的消息,以输入记录唯一的内容。

对于申请的其余部分,库在库中也不例外。因此,如果发生异常,则可以在适当的处理情况下弹出上层。

您可能会看到本文:例外处理.NET中的最佳实践

我通常会完全避免选项1,因为我看不到真正记录异常通过的每个函数的值。通常,您通常关注发生例外的地方。可能有一个情况下知道它如何到达那里的确切流程

我用于处理异常的原则是只有在我做某事时才抓住它们。如果捕获的唯一目的是重新恢复,那么抓住它就没有意义了。但是,如果我确实捕获它,然后将其记录/包装使用自定义的特定异常/处理,例如,这是一个充分的理由。我通常会发现此类任务不是在每个功能中都完成的,但最常见的是层/层边界

最新更新