python异常处理比PHP和/或其他语言更有效吗?

kei*_*ant 21 php python programming-languages exception

我已经深入了解(至少在PHP中)使用try... catch块进行流量控制是badbadmojo .我学到的只是使用它们来处理意外错误,而不是确定程序的逻辑流程,因为catch块很昂贵.

现在我正在学习python,我看到了很多例外和EAFP原则.这是否意味着python在处理异常方面更有效率,所以我不需要为流量控制担心它们,或者原理是否仍然存在?如果没有,那么PHP是规范的异常(与其他语言相比),还是Python?

Gle*_*ard 13

从历史上看,在像C++这样的语言中,与同一语言中的其他形式的流控制相比,异常非常缓慢.

在C++中,有两件事在起作用:

  • 抛出异常非常复杂.堆栈需要解开,在本机代码中这样做比在基于VM的高级语言中困难得多.
  • 定期,直接流量控制非常快.这是本机代码; 分支是一对指令,其中回滚堆栈的异常调用复杂的算法(在大的,可能压缩的表中查找堆栈数据,等等).

这种性能上的差异导致了例外背后的一般智慧:只针对不寻常的事情做到这一点,所以它只用于最有利的地方,而不是它会损害性能的地方.

这不适用于高级语言.这也有两个原因:

  • 回滚堆栈要简单得多.堆栈很容易检查; 你不需要魔术表来知道回滚堆栈的程度以及在任何给定时间构造的对象.
  • 常规程序流本质上较慢.在基于VM的语言中,一切都需要更多的工作才能开始.

例外仍然不是免费的,但这种差异不再是令人担心的问题.这意味着在C++中形成的一般智慧在这里被误用.在正常的程序流程中经常使用例外.

事实上,它们是在语言中构建的,在你一直使用的构造中.每次使用迭代器时 - 每次都会for x in xrange(1000)使用StopIteration异常来结束循环.

在Python中选择异常或线性流控制更有意义.不要根据表现选择,除非你实际上处于一个性能重要的内循环中; 在这种情况下,一如既往,剖析并查明它是否真正重要.

(我不能代表PHP.)


Ada*_*and 7

我不相信EAFP鼓励使用流量控制的例外.相反,它告诉我们在引用它之前,我们不需要费心检查对象的字典或属性中是否存在特定键.

抛出异常作为if语句的替代或具有正确的while语句或代替使用breakcontinue在循环内部不属于该类别.这是懒惰的,容易出错的程序,应该避免.