Architecture 为什么在调用堆栈中捕获较高级别的异常比在处理异常时立即捕获要好?

Architecture 为什么在调用堆栈中捕获较高级别的异常比在处理异常时立即捕获要好?,architecture,exception-handling,Architecture,Exception Handling,我在几个地方读到过,在调用堆栈的更高层捕捉异常更好,但我还没有找到这种说法的理由 斯科特·汉塞尔曼: 我认为异常应该在可以处理的地方被捕获,高或低并不重要。这不是真的吗?若否,原因为何 如果可能,请在答案中添加一个示例 谢谢 我认为应该在可以处理的地方捕获异常 当然。关键是调用堆栈中的级别越低,您就越不可能知道如何处理它。您应该在代码中可以对其进行处理的位置捕获异常。通常,生成异常的代码无法处理该问题,但调用该代码的方法或调用调用该代码的方法的方法可以优雅地处理该问题 假设您有一些代码试图打开一

我在几个地方读到过,在调用堆栈的更高层捕捉异常更好,但我还没有找到这种说法的理由

斯科特·汉塞尔曼

我认为异常应该在可以处理的地方被捕获,高或低并不重要。这不是真的吗?若否,原因为何

如果可能,请在答案中添加一个示例

谢谢

我认为应该在可以处理的地方捕获异常


当然。关键是调用堆栈中的级别越低,您就越不可能知道如何处理它。

您应该在代码中可以对其进行处理的位置捕获异常。通常,生成异常的代码无法处理该问题,但调用该代码的方法或调用调用该代码的方法的方法可以优雅地处理该问题

假设您有一些代码试图打开一个文件并读取一些数据,如果该文件不存在,它会生成一个异常。该范围内的代码只能跳转,但调用方法可能会说“哦,好吧,出现了异常。我将尝试此备用文件”或“我猜该文件不存在,所以我将继续创建一个新文件。”


这确实是异常的一大好处:它们使开发人员不必立即处理所有可能的错误情况。您可以在编写代码时期望它大部分时间都能正常工作,并且您的代码不需要因为大量错误处理而变得杂乱无章。只要公布可能引发的异常,您就可以让调用堆栈中较高级别的代码以适合该代码尝试执行的任何操作的方式处理问题。

我认为您应该在两种情况下捕获异常:

  • 你知道如何处理这个例外
  • 您正在用不同的异常包装异常

  • @哈桑:一个例子是围绕数据库的GUI。数据库代码遇到错误时抛出异常;GUI可以向用户显示这些错误消息,可能有各种修复错误的选项。如果没有上下文,很难说出任何具体的内容。“更好的方法是抓住更高层次的异常”——好吧,但更高层次比什么?是什么来源写的?他们谈论的背景是什么。在某些情况下,一个或两个级别可能不够,但在其他情况下可能是完美的。没有规则——做有意义的事。我有类似的问题@哈桑·汗,你所说的“处理”是什么意思,你在哪里写“…应该在可以处理的地方捕获异常…”?要处理捕获的异常,是否要记录异常,捕获并吃掉异常,
    throw,将其包装并作为InnerException抛出,更改任何特定状态@韦伯斯特:我的意思是处理例外情况。即重试该操作。