偶尔在我的代码中,我会故意使用抛出的异常作为事件触发器。例如,我将循环直到抛出异常,然后break;
在catch
子句中。这是不好的做法吗?查询我正在循环的某些属性以预先确定索引(即预先确定何时停止循环)会更有效(或更清洁)吗?当然,只有当我确定实际上会抛出异常以避免无限循环时,我才会这样做。谢谢!
3 回答
这不是一个真正与语言无关的问题!
某些语言,例如 Python,具有相当轻量级的异常,并且它们使用异常来控制流是一种非常不受欢迎的方法——例如,for
Python 中的每条语句(除非被 a 提前终止break
)总是在出现异常时终止发生(StopIteration
中使用的迭代器的异常for
)。因此,Python 的任何用户都不能反对由异常系统地终止的循环……除非他们从不使用for
循环(几乎不可能;-)。
其他语言认为异常是非常特殊的事件,在这些语言中,您不应该将它们用于普通的流程控制任务;显然,目前对您的问题给出的所有答案都以“与语言无关”的方式认为这是理所当然的,而忽略了 Python 等语言的存在或实际性质。
我们这些对这两种语言都相当了解的人学会了“随波逐流”:我在 Python 中使用异常进行流控制没有问题,但我绝对会避免在 C++ 中这样做,例如!
是的,这是不好的做法。异常应该用于异常的情况——例如,在正常操作过程中不应该发生的真正错误的条件。
一个重要的原因是异常在 CPU 时间方面很昂贵。
如果您使用标志或其他信号来终止循环,它将更加有效,并且可能更容易调试和验证。
在正常程序控制流中抛出异常是不好的做法。应为异常事件(例如错误处理)保留异常。
不断循环等待某些事件发生也不是很好。查看观察者设计模式,了解编写此类事物的正确方法。