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

问题描述 投票:28回答:4

遗留错误处理倾向于遵循所有函数根据成功/失败返回代码的方法。您将检查此代码并适当地处理(如果有错误)。

但是,现代编程语言遵循异常模型,在这种情况下,如果发生无法正确处理的exceptional,则会引发异常-一直冒泡直到被处理。

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

说明/链接将不胜感激。

exception exception-handling error-handling
4个回答
38
投票

我已经详细介绍了这一点:Exceptions vs. status returns,但简要地是:

  1. 异常使您的代码清除每次调用返回测试状态时所需的所有检查,
  2. 例外使您可以将函数的返回值用作实际值,
  3. 异常可以携带比状态返回更多的信息,
  4. 最重要的是:不可通过无为而忽略异常,而状态返回则可以。

最后一点:如果您忘记执行状态返回操作,则会忽略错误。如果您忘记对异常进行处理,则异常会在可见到软件的外层时冒泡。


11
投票

这里有两个原因

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

4
投票

状态码通常比表示要处理函数的立即调用代码的情况更好。状态代码的问题在于,如果立即调用代码不处理它们,则可能什么也不会发生。如果代码抛出异常,并且不准备立即调用代码来处理该异常,则该异常将传播到至少声称已准备好该代码的代码。


0
投票

[Throwing an exception明确指出出了问题,这是程序员更难忽略的](因为如果没有catch块,程序将终止。)>

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


对于Javascript

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.