【发布时间】:2011-06-07 22:40:42
【问题描述】:
传统错误处理倾向于遵循所有函数根据成功/失败返回代码的方法。您将检查此代码并适当地处理(如果有错误)。
然而,现代编程语言遵循异常模型,如果发生无法正确处理的异常事件,则会引发异常 - 一直冒泡直到处理完毕。
我的问题是我们为什么要转向异常模型?这背后的原因是什么?为什么更好?
解释/链接将不胜感激。
【问题讨论】:
标签: exception exception-handling error-handling
传统错误处理倾向于遵循所有函数根据成功/失败返回代码的方法。您将检查此代码并适当地处理(如果有错误)。
然而,现代编程语言遵循异常模型,如果发生无法正确处理的异常事件,则会引发异常 - 一直冒泡直到处理完毕。
我的问题是我们为什么要转向异常模型?这背后的原因是什么?为什么更好?
解释/链接将不胜感激。
【问题讨论】:
标签: exception exception-handling error-handling
这里有几个原因
【讨论】:
我已经详细地写过这个:Exceptions vs. status returns,但简短地说:
扩展最后一点:如果您忘记对状态返回执行您应该执行的操作,您将忽略错误。如果您忘记对异常执行您应该执行的操作,异常会冒泡到软件的外层,并在那里变得可见。
【讨论】:
状态代码通常比异常更好,因为它们表示函数的立即调用代码准备处理的情况。状态码的问题在于,如果直接调用代码不处理它们,很可能什么都不会。如果代码抛出异常并且直接调用的代码没有准备好处理它,则异常将传播到至少声称已准备好的代码。
【讨论】:
http 协议)。所以这似乎带来了直接的开销,而常见的编程语言似乎具有用于异常和操作符的本地构造来处理它们。这意味着更少的开销……函数式编程的典型特征。
Throwing an exception 明确指出了程序员难以忽视的问题(如果没有 catch 块,程序将终止)。
异常将终止函数其余部分的执行并将控制权传递给下一个catch块(如果当前调用堆栈中有任何异常。如果没有,则程序将终止)
是的,它是可选的,但您应该始终使用 .catch() 处理程序(用于 Promises)。
这意味着,我们可以在一个处理程序中处理许多函数中的许多错误,如下所示;
storeData()
.then(changeSomething)
.then(storeData)
.catch((e) => {
// Handle the error.
})
在这里,我们可以看到如何同时处理三个不同功能的错误。从本质上讲,catch 的行为是将所有函数包装在一个同步的 try/catch 中。
【讨论】: