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

我把它钻进我的脑海里(至少在PHP中)使用块进行流量控制是糟糕的。我学到的是,只使用它们来处理意外错误,而不是确定程序的逻辑流,因为块很昂贵。try... catchcatch

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


答案 1

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

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

  • 引发异常非常复杂。堆栈需要解卷,在本机代码中执行此操作比在基于 VM 的高级语言中更难。
  • 常规的直接流量控制速度非常快。它是原生代码;分支是几个指令,其中回滚堆栈的异常调用复杂的算法(在大型的、可能压缩的表中查找堆栈数据,依此类推)。

这种性能差异导致了例外背后的普遍智慧:只对不寻常的事情这样做,所以它只在最有益的地方使用,而不是在会损害性能的地方使用。

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

  • 回滚堆栈要简单得多。堆栈非常容易检查;您不需要魔术表来知道堆栈回滚多远以及在任何给定时间构造了哪些对象。
  • 常规程序流本身就比较慢。在基于VM的语言中,一切都只需要做更多的工作就可以开始了。

例外仍然不是免费的,但这种差异不再是需要担心的事情。這意味著在C++中形成的一般智慧在這裡被誤用了。异常经常在正常程序流中使用。

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

在Python中选择异常或线性流控制,基于此更有意义。不要根据性能进行选择,除非您实际上处于性能至关重要的内循环中;在这种情况下,一如既往,分析并找出它是否真的重要。

(我不能说PHP。


答案 2

我不认为 EAFP 鼓励使用异常进行流控制。相反,它告诉我们,在引用对象之前,我们不需要费心检查字典或对象属性中是否存在特定键。

抛出异常作为语句的替代项或具有正确的语句,或者不使用循环或在循环内部,都不属于该类别。这是懒惰的,容易出错的进程,应该避免。ifwhilebreakcontinue


推荐