【问题标题】:Why use an exception instead of if...else为什么使用异常而不是 if...else
【发布时间】:2011-11-17 01:32:40
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 异常适用于异常情况,不应用于逻辑。
  • 我相信创建用户定义的异常是为了将它们用于逻辑和流控制

标签: exception exception-handling


【解决方案1】:

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

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

【讨论】:

  • +1 我不确定在这个例子中它是否在 Python 中是“首选”,但很好地指出所使用的语言在异常的“正确使用”中起着重要作用。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        使用异常有充分且无可争辩的理由 - 无论使用何种语言。我坚信是否使用异常的决定与使用的特定语言无关。

        使用异常是一种通用方法,可以以松散耦合的方式通知代码的其他部分发生了错误。想象一下,如果您想通过使用 if.. nad else.. 来处理一些异常情况,您需要在代码的不同部分插入一些任意变量和其他可能很容易导致很快出现意大利面条代码的东西。

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

        【讨论】:

          【解决方案6】:

          正如有人已经说过的,编程语言中的“异常”是针对特殊情况的,而不是设置程序的逻辑流程。例如,在给定代码 sn-p 的情况下,您必须查看封闭方法或函数的意图是什么。是否检查 array.length &lt; countNum 部分业务逻辑。如果是,那么放一对if/else 就可以了。如果该条件不是业务逻辑的一部分并且封闭方法的意图是其他内容,则为其他内容编写代码并抛出异常,而不是采用if/else 方式。例如,您为一所学校开发了一个应用程序,在您的应用程序中,您有一个方法GetClassTopperGrades,它负责业务逻辑部分,该部分需要返回某个班级学生的最高分。方法/函数定义是这样的:

          int GetClassTopperGrades(string classID)
          

          在这种情况下,该方法的目的是根据应用程序的业务逻辑返回有效类的成绩,该成绩始终为正整数。现在如果有人调用你的方法并传递一个垃圾字符串或null,它应该怎么做?如果应该抛出异常,例如ArgumentException 或 'ArgumentNullException' 因为在此特定上下文中这是一个异常案例。该方法假定始终传递有效的类 ID,并且 NULL 或空字符串不是有效的类 ID(与业务逻辑的偏差)。

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

          【讨论】:

            猜你喜欢
            • 2010-10-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-10
            • 2014-06-16
            • 2021-07-15
            • 1970-01-01
            • 1970-01-01
            • 2020-10-14
            相关资源
            最近更新 更多