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

python异常处理是否比PHP和/或其他语言更有效?,php,python,exception,programming-languages,Php,Python,Exception,Programming Languages,我已经在脑海中钻研过(至少在PHP中是这样)使用try是一件坏事。。。用于流量控制的catch块。我学到的是使用它们只处理意外错误,而不是确定程序的逻辑流,因为catch块非常昂贵 现在我正在学习python,我看到到处都有很多异常和原理。这是否意味着python在处理异常方面更高效,因此我不需要为流控制担心异常,还是这一原则仍然有效?如果不是,PHP是标准的例外(与其他语言相比),还是Python?我不认为EAFP鼓励使用异常进行流控制。相反,它告诉我们,在引用某个对象之前,不必费心检查字典中

我已经在脑海中钻研过(至少在PHP中是这样)使用
try是一件坏事。。。用于流量控制的catch
块。我学到的是使用它们只处理意外错误,而不是确定程序的逻辑流,因为
catch
块非常昂贵


现在我正在学习python,我看到到处都有很多异常和原理。这是否意味着python在处理异常方面更高效,因此我不需要为流控制担心异常,还是这一原则仍然有效?如果不是,PHP是标准的例外(与其他语言相比),还是Python?

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


将异常作为
if
语句的替代,或在
语句中使用正确的
while
语句,或在循环内部不使用
break
continue
都不属于该类别。这是一种懒惰、容易出错的编程,应该避免。

伟大的Alex Martelli在《简而言之的Python》一书中对EAFP与LBYL进行了很好的概述。(他非常倾向于使用EAFP)

def值得一读:

有一个特定的异常,它只应该在正常执行流中使用:
StopIteration
。这对我来说意味着Python的创建者并不认为异常开销是不合理的


这是因为异常处理是Uber有效的还是其他语言比较慢的问题是另一个问题…

历史上,在C++语言中,与同一语言中的其他形式的流控制相比,异常的速度非常慢。 在C++中,有两件事在工作:

  • 抛出异常非常复杂。堆栈需要展开,在本机代码中展开要比在基于高级VM的语言中展开困难得多
  • 常规的直接流量控制非常快。它是本地代码;分支是一对指令,其中回滚堆栈的异常调用一个复杂的算法(在一个大的、可能是压缩的表中查找堆栈数据,等等)
这种性能上的差异导致了异常背后的普遍智慧:只在不寻常的事情上使用,所以它只在最有利的地方使用,而不是在会影响性能的地方使用

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

  • 回滚堆栈要简单得多。堆栈非常容易检查;您不需要魔法表来了解堆栈回滚的距离以及在任何给定时间构造的对象
  • 常规程序流程天生就比较慢。在基于VM的语言中,一切都需要更多的工作来开始
例外情况仍然不是免费的,但这种差异不再是那么令人担忧的问题。这意味着C++中形成的一般智慧在这里被误用。在正常程序流中经常使用异常

事实上,它们被构建在语言中,在你一直使用的结构中。每次使用迭代器时——对于xrange(1000)中的x,每次
,都会使用
StopIteration
异常来结束循环

在Python中选择异常或线性流控制,基于它们更有意义。不要基于性能进行选择,除非你实际上处于一个性能重要的内部循环中;在这种情况下,像往常一样,分析并找出它是否真的重要


(我不能代表PHP说话。)

回答这个问题:是的。Python异常很便宜。if测试更便宜,所以是的,您应该只在“意外”情况下使用异常,就像您期望代码大多数时候失败一样,在执行之前检查。由于if检查将避免实际的尝试以及异常的引发和捕获,因此在失败的情况下,这将快得多。(当然,除非测试本身很昂贵)

但避免这样的例外是没有意义的。Python不会拖到爬行状态,因为您捕获了很多异常


和往常一样:没有评测的优化还为时过早。

我读了更多的书,并且意识到了另一件没有人提到的重要事情:在Python中,错误和异常之间没有区别。我知道这一点,但我认为直到现在我才领会其意义

在PHP中,您可以包装
$page->GetContent()try…catch
中的code>会阻止您想要的所有内容,但是如果
$page
不是对象,您的应用程序仍会突然停止,并导致致命错误。因此,在PHP(以及任何其他无法捕获错误的语言)中,您需要一定级别的LBYL

Python基本上会说,“这太愚蠢了,我应该能够抓住它们。”只要试着做你需要做的事情,并处理
块中除
之外的任何影响


这是我遇到的一个问题。

C++在异常方面与PHP类似(至少对于桌面应用程序-嵌入式可能不同)-抛出的异常确实会损害您的性能。抛出异常时,C#的性能也会严重下降。我刚刚意识到我键入了“正常异常”对于StackOverflower所写的一本书的一个非常有趣且经授权的观点的链接,请不要将其视为一个糟糕的双关语X-P+1:)