使用已处理的异常作为预期触发器?

时间:2009-11-04 04:53:19

标签: language-agnostic exception unhandled-exception

偶尔在我的代码中,我会故意将抛出的异常用作事件触发器。例如,我将循环UNTIL抛出异常,然后break;子句中的catch。这是不好的做法吗?查询我循环的某些属性以预先确定索引(即预先确定何时停止循环)会更有效(或更清晰)吗?当然,当我确信实际上会抛出异常以避免无限循环时,我才会这样做。谢谢!

3 个答案:

答案 0 :(得分:2)

这不是一个与语言无关的问题!

某些语言(如Python)具有相当轻量级的异常,并且它们使控制流的异常成为一种非常不可接受的方法 - 例如,Python中的每个for语句(除非过早地终止发生异常时始终终止break)(来自StopIteration中使用的迭代器的for异常)。因此,Python的任何用户都不能反对由异常系统地终止的循环......除非他们永远不会使用for循环(非常不可能; - )。

其他语言认为异常是非常特殊的,而在这些语言中你不应该将它们用于普通的流控制任务;显然,目前给你的问题的所有答案都以“语言无关”的方式理所当然地忽略了存在或者实际的性质或语言,例如Python。

我们这些知道两种语言的人都能很好地学会“随流而游”:我在Python中使用流控制异常没有问题,但我绝对不会在C ++中这样做,例如!

答案 1 :(得分:0)

是的,这是不好的做法。异常应该用于例外的事情 - 例如在正常操作过程中不应发生的真正错误的条件。

一个重要原因是异常在CPU时间方面是昂贵的。

如果您使用标志或其他信号来终止循环,它将更加高效,并且可能更容易调试和验证。

答案 2 :(得分:0)

将异常作为正常程序控制流程的一部分,这是不好的做法。应该为异常事件保留例外,例如错误处理。

循环不断等待某些事件发生也不是那么好。查看Observer design pattern以获取正确的方式来编写此类内容。