可以将异常完全替换为if .. else吗?

时间:2011-08-16 02:07:47

标签: programming-languages

我是编程新手,我有一个概念性问题。

也就是说,“异常”能否被“if .. else”完全取代?

我知道“异常”是处理一些可能导致错误或崩溃的异常情况。

但我们也使用“if .. else”来确保变量值的正确性,不是吗?

或“异常”真的可以被“if .. else”取代,但使用“exception”还有其他好处(比如方便吗?)

谢谢,抱歉我的英语不好。

6 个答案:

答案 0 :(得分:3)

异常和“if..else”之间的最大区别是异常会调用调用堆栈:在一个函数中引发的异常可以在调用者中捕获堆栈中的任意数量的帧。使用“if”语句不允许以这种方式转移控制,所有内容都必须在检测到条件的同一函数中处理。

答案 1 :(得分:2)

从技术上讲,答案是肯定的,异常可以完全被if-else取代。例如,许多语言都没有可以抛出和捕获的本机异常概念。

异常的主要优点是代码可读性和可维护性。他们的服务目的与if-else不同。例外情况适用于特殊情况,而if-else适用于程序流程。

请参阅解释差异的this excellent article

答案 2 :(得分:1)

你的大部分问题都与Python有关,所以这是基于这个事实的答案。

在Python中,使用try - except块是惯用的(或“pythonic”)。我们称之为"EAFP": Easier to ask for forgiveness than permission

在C中,没有例外,"LBYL": Look before you leap通常会产生大量if (...)语句。

所以,虽然您可以使用LBYL,但您应该遵循编程语言的习语:使用异常处理异常情况和if - 条件语句。

答案 3 :(得分:0)

这需要管理很多分支条件。理论上,完美代码不需要例外,但在现实生活中不存在完美的代码。例外是一种以受控方式处理问题的完善机制。

答案 4 :(得分:0)

处理函数错误的旧方法如下所示:

int result = function_returns_error_code();
if (result != GOOD)
{
    /* handle problem */
}
else
{
   /* keep going */
}

这个解决方案的问题(以及其他类似的问题 - 使用if-else)是如果存在真正的问题,并且程序员没有使用if ... else正确处理它(如果函数返回错误表示主要问题的代码,但程序员忘记了它,它被忽略了。除了它之外,它会越来越远,直到它被处理或程序退出为止。

此外,检查函数中的错误代码或传递放置错误代码的参数是很繁琐的。对于可维护性和抽象,它更简单,更清晰,更好地使用异常。

答案 5 :(得分:0)

在大多数高级语言中,使用异常通常比if-else更有效,因为您避免了多次验证。例如:

if value is not 0 then print 10 / value

在大多数解释器中10 / value将在使用它之前在内部测试value是否是有效的分频器,因此您实际上已经测试了两次相同的问题。在某些情况下,异常可能会从硬件中一直发生,因此根本不会进行软件验证。

另一方面:

try print 10 / value ... catch exception

仅测试值是否有效一次。此外,测试将比您自己的代码更好地优化,并且更能够处理真正意外的情况(如内存不足错误)。