2024-06-02 18:47:53 发布
网友
我已经在我的头脑中钻研过(至少在PHP中)使用try... catch块进行流控制是一种错误。我学到的是只使用它们来处理意外错误,而不是确定程序的逻辑流,因为catch块非常昂贵。在
try... catch
catch
现在我正在学习python,我看到了很多异常和EAFP原则。这是否意味着python在处理异常方面更有效,所以我不需要为流控制而担心它们,还是这个原则仍然有效?如果不是,那么PHP是规范的例外(与其他语言相比),还是Python?在
我不认为EAFP鼓励使用异常来进行流控制。相反,它告诉我们,在引用对象之前,我们不必费心检查字典中是否存在某个特定的键或某个对象的属性。在
抛出异常作为if语句的替代,或者具有正确的while语句,或者在循环中不使用break或{}语句,都不属于这一类。这是一种懒惰的、容易出错的程序设计,应该避免。在
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++中形成的一般智慧在这里被误用。异常通常在正常程序流中使用。在
事实上,它们被构建到语言中,在你一直使用的结构中。每次使用迭代器——Everyfor x in xrange(1000),就会使用一个StopIteration异常来结束循环。在
for x in xrange(1000)
StopIteration
在Python中选择异常或线性流控制,基于哪个更有意义。不要基于性能进行选择,除非你真的处在一个性能很重要的内部循环中;在这种情况下,一如既往地分析并找出它是否真的重要。在
(我不会说PHP。)
我不认为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++中形成的一般智慧在这里被误用。异常通常在正常程序流中使用。在
事实上,它们被构建到语言中,在你一直使用的结构中。每次使用迭代器——Every
for x in xrange(1000)
,就会使用一个StopIteration
异常来结束循环。在在Python中选择异常或线性流控制,基于哪个更有意义。不要基于性能进行选择,除非你真的处在一个性能很重要的内部循环中;在这种情况下,一如既往地分析并找出它是否真的重要。在
(我不会说PHP。)
相关问题 更多 >
编程相关推荐