为什么抛出异常而不是返回错误代码更好?

时间:2011-01-12 16:08:54

标签: exception exception-handling error-handling

传统错误处理往往遵循所有函数根据成功/失败返回代码的方法。您将检查此代码并正确处理(如果出现错误)。

然而,

现代编程语言遵循异常模型,如果发生某些异常但无法正确处理的异常,则抛出异常 - 这会一直冒泡直到处理完毕。

我的问题是为什么我们会转向异常模式?这背后的原因是什么?为什么会更好?

解释/链接将非常感激。

4 个答案:

答案 0 :(得分:34)

我已经详细地写了这篇文章:Exceptions vs. status returns,但简单地说:

  1. 在每次调用时测试状态返回时,例外情况会使代码清除所有必要的检查,
  2. 例外允许您将函数的返回值用于实际值
  3. 例外可以提供比状态返回更多的信息,
  4. 最重要的是:异常不能通过不作为被忽略,而状态返回则可以。
  5. 要扩展最后一点:如果您忘记执行状态返回应执行的操作,则忽略错误。如果您忘记执行应对异常执行的操作,则异常会冒泡到软件的外层,使其可见。

答案 1 :(得分:10)

以下是几个原因

  • 忽略异常需要开发人员采取行动,而忽略错误的返回值则需要完全执行0操作。理论上,这使得开发人员更有可能处理错误而不是忽略它或者甚至没有意识到它正在发生。
  • 在错误点和处理之间提供更清晰的分离。它不会强制在两者之间的每个点手动传播错误。
  • 与简单的错误代码相比,异常可以获得更大,更丰富的信息负载。有很多方法可以使用错误代码执行此操作,但这更像是事后的想法而且有点麻烦。

答案 2 :(得分:4)

状态代码通常比异常更好,因为它们表示函数的立即调用代码准备处理的情况。状态代码的问题在于,如果直接调用代码不处理它们,则可能没有任何意义。如果代码抛出异常并且立即调用代码没有准备好处理它,则异常将传播到至少声称已经准备好的代码。

答案 3 :(得分:1)

Throwing an exception明确指出了出错的地方,这是程序员很难忽略的(因为如果没有catch块,程序将终止)。

异常将终止函数其余部分的执行,并将控制权传递给下一个catch块(如果当前调用堆栈中有任何catch块。如果没有,则程序将终止)


对于Javascript

是的,它是可选的,但您应始终使用.catch()处理程序(对于Promises)。

这意味着,我们可以在一个处理程序中处理多个函数中的许多错误,如下所示;

storeData()
    .then(changeSomething)
    .then(storeData)
    .catch((e) => {
        // Handle the error.
    })

在这里,我们可以看到如何同时处理三个不同功能的错误。本质上,catch的行为就像将所有功能包装在同步try / catch中一样。