Programming languages 是否可以用if.完全替代异常。。其他的

Programming languages 是否可以用if.完全替代异常。。其他的,programming-languages,Programming Languages,我是编程新手,我有一个概念问题 也就是说,“例外”能被“如果……否则”完全取代吗 我知道“异常”是指处理一些可能导致错误或崩溃的异常情况 但我们也使用“if..else”来确保变量值的正确性,不是吗 或者“exception”真的可以被“if..else”代替,但是使用“exception”还有其他好处(比如方便?) 谢谢你,很抱歉我的英语不好。异常和“if..else”之间最大的区别是异常会在调用堆栈中传递:在一个函数中引发的异常可以在调用堆栈上任意数量的帧中被捕获。使用“if”语句不允许以这

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

也就是说,“例外”能被“如果……否则”完全取代吗

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

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

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


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

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

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

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

异常的主要优点是代码可读性和可维护性。它们的用途不同于其他用途。异常用于异常条件,而if-else用于程序流


请参见解释差异。

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

int result = function_returns_error_code();
if (result != GOOD)
{
    /* handle problem */
}
else
{
   /* keep going */
}
这个解决方案(以及其他类似的解决方案——使用if-else)的问题是,如果存在真正的问题,并且程序员没有使用if…else正确地处理它(如果函数返回一个指示主要问题的错误代码,但程序员忘记了),它将被忽略。除了一个例外,它在调用堆栈中的位置越来越高),直到被处理或程序退出


此外,检查函数中是否有错误代码,或者传递一个参数以将错误代码放入其中,都是非常繁琐的。出于可维护性和抽象性的考虑,使用异常更简单、更干净、更好。

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

如果值不是0,则打印10/值

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

另一方面:

尝试打印10/值。。。捕获异常


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

您的大多数问题都与Python有关,因此这里有一个基于这一事实的答案

在Python中,除了块之外,使用
try
-
是习惯用法(或“pythonic”)。我们称之为

在C语言中,如果没有异常,通常会出现大量的
if(…)
语句


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

当您说
exception
时,是指
try-catch
,还是仅指
exception
本身?对不起。。但是我不能理解其中的不同之处:domanokz提出了一个相关的问题,我的回答假设您在讨论java/python/javascript意义上的异常?这太荒谬了,-1如果我调用某个随机库函数,该函数的代码为(x==1){throw new FileNotFoundException();},您将如何重现它?挖掘库的源代码并重复完全相同的代码?这是如何被认为是一个完美的替代??正如我对这个问题的理解(可能是错误的,但基于标记编程语言——并且没有指向Java、库或其他任何东西的标记),它指的是一个关于构造编程语言的一般性问题。你的解释完全公正。显然,如果您想使用使用异常的库,您需要。。。例外。关键字是完美的,即使您不使用第三方库,并且您希望在调用堆栈中传递某些内容,您也需要根据返回值将这些if/else放入调用堆栈的每个函数中。我不认为那是完美的;我想我们会同意不同意…非常感谢,这真的很有帮助!我认为这两种编码风格的存在隐含地意味着“异常”可以被“if..else”完全替代,大致上是吧?一个很大的区别是,异常可以在调用堆栈中被进一步捕获,在调用堆栈中使用
if
检查更加本地化。