为什么使用异常而不是if ... else

时间:2011-11-17 01:32:40

标签: exception exception-handling

例如,在“数组索引越界”异常的情况下,为什么我们不提前检查数组长度:

 if(array.length < countNum)
 {
 //logic
 }
 else
 {
 //replace using exception
}

我的问题是,为什么选择使用例外?何时使用例外,而不是if-else

感谢。

6 个答案:

答案 0 :(得分:2)

这取决于给定语言的可接受做法。

在Java中,惯例是始终尽可能检查条件,而不是使用流控制的异常。但是,例如,在Python中,不仅以这种方式使用异常是可以接受的,而且它也是一种优选的实践。

答案 1 :(得分:2)

它们用于通知调用代码的代码发生异常情况。异常比形成良好的if / else逻辑更昂贵,因此您在特殊情况下使用它们,例如在代码中达到无法在本地处理的条件,或者支持为代码的调用者提供如何处理错误条件的选择。

通常,如果您发现自己在自己的函数或方法中抛出和捕获异常,您可能会找到一种更有效的方法。

答案 2 :(得分:1)

这是一个示例,其中使用异常而不是条件实际上会更好。

假设您有10,000个字符串的列表。现在,您只需要那些整数的项目。现在,您知道其中很少一部分不是整数(以字符串形式)。那么在尝试转换它们之前,你应该检查每个字符串是否是整数?或者你应该尝试转换它们并抛出并捕获异常,如果你得到一个非整数?第二种方法更有效,但如果它们大多数是非整数,那么使用if语句会更有效。

但是,大多数情况下,如果可以用条件替换它们,则不应使用异常。

答案 3 :(得分:0)

这个问题有很多答案。作为一个例子,从Java开始,当你使用多个线程时,有时你需要中断一个线程,线程会在抛出InterruptedException时看到这个。

其他时候,您将使用抛出某些异常的API。你将无法避免它。如果API抛出一个IOException,那么你就可以捕获它,或让它冒出来。

答案 4 :(得分:0)

为什么要使用例外有强烈而无可争议的理由 - 无论语言如何。我坚信,关于是否使用例外的决定与使用的特定语言无关。

使用异常是一种通用方法,用于以松散耦合的方式通知代码的其他部分发生了错误。让我们想象一下,如果你想通过使用if ... nad else来处理一些异常条件,你需要在代码的不同部分插入一些任意变量和其他很可能很快就会产生意大利面代码的东西。

接下来想象一下,你正在使用任何外部库/包,并且它的作者决定以其他任意方式处理他/她的代码以处理错误的状态 - 它会迫使你调整它的处理方式它 - 例如,你需要检查特定方法是返回true还是false或者其他什么。使用异常会使处理错误变得更加容易 - 您只是假设如果出现问题 - 其他代码将抛出异常,因此您只需将代码包装在try块中并以自己的方式处理可能的异常。

答案 5 :(得分:0)

正如某人已经说过的那样,编程语言中的“异常”用于特殊情况,而不是设置程序的逻辑流程。例如,在给定问题代码段的情况下,您必须查看封闭方法或函数的意图。是否检查array.length < countNum是业务逻辑的一部分。如果是,那么可以放入一对if/else。如果该条件不属于业务逻辑的一部分,并且封装方法的意图不是另外的东西,那么请为该东西编写代码并抛出异常,而不要采用if/else的方式。例如,您为学校开发了一个应用程序,并且在您的应用程序中,您有一种方法GetClassTopperGrades负责业务逻辑部分,该方法要求返回某一类中成绩最高的学生的及格分数。方法/函数的定义如下:

int GetClassTopperGrades(string classID)

在这种情况下,该方法的目的是根据应用程序的业务逻辑返回有效类的等级,该等级将始终为正整数。现在,如果有人调用您的方法并传递垃圾字符串或null,该怎么办?如果应该抛出异常,例如NullReferenceException或'InvalidArguementException',因为在此特定情况下这是例外情况。该方法假定始终传递有效的类ID,而NULL或空字符串不是有效的类ID(与业务逻辑的偏差)。

除此之外,在某些情况下没有对给定代码结果的事先了解,并且没有防止异常情况的明确方法。例如,查询某个远程数据库,如果网络断开,除了抛出异常外,您没有其他选择。在向远程数据库发出每个SQL查询之前,您会检查网络连接吗?