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

2024-06-02 18:47:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在我的头脑中钻研过(至少在PHP中)使用try... catch块进行流控制是一种错误。我学到的是只使用它们来处理意外错误,而不是确定程序的逻辑流,因为catch块非常昂贵。在

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


Tags: 程序规范语言错误逻辑phptry原则
3条回答

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

抛出异常作为if语句的替代,或者具有正确的while语句,或者在循环中不使用break或{}语句,都不属于这一类。这是一种懒惰的、容易出错的程序设计,应该避免。在

伟大的Alex Martelli在《Python in a Nutshell》一书中对EAFP与LBYL进行了很好的概述。(他倾向于使用EAFP)

值得一读:
http://books.google.com/books?id=JnR9hQA3SncC&lpg=PA134&ots=JaaWGy-24u&dq=alex%20martelli%20eafp%20lbyl&pg=PA134#v=onepage&q&f=false

<>历史上,在C++语言中,与其他语言的流控制EME>相比,异常在同一语言EME>中的速度非常慢。在

在C++中,有两件事在工作:

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

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

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

  • 回滚堆栈要简单得多。堆栈非常容易检查;您不需要魔法表来知道在任何给定时间将堆栈回滚多远以及构造了什么对象。在
  • 常规程序流天生就比较慢。在基于虚拟机的语言中,一切都需要更多的工作来开始。在

例外情况仍然不是免费的,但差距已不再是一个值得担心的问题。这意味着C++中形成的一般智慧在这里被误用。异常通常在正常程序流中使用。在

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

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

(我不会说PHP。)

相关问题 更多 >