代码之家  ›  专栏  ›  技术社区  ›  Aaron Palmer

总是尝试捕获外部资源调用?

  •  8
  • Aaron Palmer  · 技术社区  · 16 年前

    我应该始终在try catch中包装外部资源调用吗?(即对数据库或文件系统的调用)在调用外部资源时,是否存在错误处理的最佳实践?

    6 回复  |  直到 16 年前
        1
  •  7
  •   Pop Catalin    16 年前

    捕捉 唯一例外 那就是你 可以处理 . 因此,例如,在使用外部资源时,最佳做法是 具体的 您知道可以处理的异常。对于文件,可以是(ioexception、securityexception等),对于数据库,可以是sqlexception或其他。

    无论如何, 别抓 你的例外 不要处理 让它们流到上层。或者,如果出于某种原因,您确实捕获了异常但不处理它们,则使用 投掷; (这将创建一个回传操作,而不是trow)。

    如果您使用的资源不知道可能引发哪种类型的异常,那么就必须捕获一般的异常类型。在这种情况下,最安全的事情是使用来自不同应用程序域的上述资源(如果可能),或者让异常冒泡到可以显示或记录它们的顶层(ex-ui)。

        2
  •  3
  •   Jon Skeet    16 年前

    我认为有三个原因可以阻止:

    • 您可以处理异常并恢复(从“低级”代码)
    • 您想重新包装例外(同样,从“低级”代码)
    • 你在堆栈的顶部,虽然你不能恢复操作本身,但你不希望整个应用程序崩溃。

    如果你坚持这些,你应该有非常少的捕获块相比 try/finally 积木-还有那些 尝试/最终 街区几乎总是在呼叫 Dispose 因此最好写为 using 声明。

    底线:拥有一个 finally 阻止释放资源,但 catch 积木通常比较少。

        4
  •  2
  •   Marc Gravell    16 年前

    埃里克·利珀特有一个很好的博客, here .

    除非你能做一些有用的事情,否则没有任何意义(除了“烦人”(见博客))捕捉到一个例外;在大多数情况下,你就是不能——所以让它冒泡(你的用户界面显然应该清理和显示一些东西)。

    但是,您可能会有一个“尝试/最终”来处理资源管理。或者甚至更干净,一个“使用”块也可以这样做。

        5
  •  0
  •   Timothy Carter    16 年前

    我认为绝对的答案是完全有条件的(你如何控制环境,性能和一致性之间的预期平衡是什么,以及我确信的许多其他平衡),但一般来说,我总是这样做,选择安全性而不是潜在的较慢的性能。

        6
  •  0
  •   Luk    16 年前

    它总是取决于你想要实现什么。没有响应的服务器可能会严重到停止所有例行程序所做的操作,并且应该向调用方抛出异常。

    在其他情况下,您不关心是否未能更新数据库。然后使用异常是可以的。

    显然,您不想向最终用户显示堆栈跟踪,所以您需要在某个地方捕获它。