当前位置: 首页 > 面试题库 >

Python例外:EAFP和什么才是真正的例外?

魏安然
2023-03-14
问题内容

在几个地方曾说过,Python强调“要求宽恕比允许容易”(EAFP),应该通过这样的想法来加以限制:只有在真正特殊的情况下才应调用异常。考虑以下情况,在其中我们弹出并推送优先级队列,直到只剩下一个元素:

import heapq
...
pq = a_list[:]
heapq.heapify(pq)
while True:
    min1 = heapq.heappop(pq)
    try:
        min2 = heapq.heappop(pq)
    except IndexError:
        break
    else
        heapq.heappush(pq, min1 + min2)
# do something with min1

该异常仅在len(a_list)循环的迭代中引发一次,但这并不是真正的例外,因为我们知道它最终会发生。此设置使我们a_list不必检查是否为空,但是,(也许)它比使用显式条件可读性差。

对于这种非异常程序逻辑,使用异常的共识是什么?


问题答案:

仅在真正例外的情况下才应调用异常

并非在Python中:例如, 每个 for循环(除非过早地breaks或returns
StopIteration)都被抛出并捕获的异常()终止。因此,每个循环一次发生的异常对于Python来说并不奇怪-那里的情况经常发生!

有问题的原则在其他语言中可能至关重要,但这绝对没有理由将该原则应用于Python,因为它与语言的精神背道而驰。

在这种情况下,我喜欢Jon的重写(应该通过删除else分支来进一步简化),因为它使代码更紧凑-
这是一个务实的原因,最肯定不是使用异类原理对Python样式进行“调和”。



 类似资料:
  • 问题内容: Python中的“使用EAFP原理”是什么意思?你能提供一些例子吗? 问题答案: 一个示例是尝试访问字典键。 EAFP: LBYL:

  • 我收到警告: 我在看医生。 我看到很多关于如何禁用它的帖子,如果我知道我在做什么,就像这一个。 一个有用的总结(或者只是一个正确方向的观点)将非常感谢,这样我就可以决定是否禁用它。我的直觉是我不应该禁用它,所以我想知道如何正确地解决这个问题。

  • 我运行了几个测试场景,其中我从SOAP客户端调用远程系统的SOA服务,并遇到了各种远程异常。你能帮我确定每个错误意味着什么吗- 1) java.net网站。ConnectException:连接被拒绝“ 2)Java . net . socket time out异常:连接超时" 3) 连接异常: 连接超时”

  • 问题内容: 我已经阅读了Python中的Class方法[什么用?但是这篇文章中的例子很复杂。我正在寻找一个清晰,简单,准系统的Python类方法用例的例子。 您能否列举一个小的特定示例用例,其中Python类方法将是完成此工作的正确工具? 问题答案: 初始化的辅助方法:

  • 问题内容: 请帮忙。将来自扫描仪的提示显示到控制台后,出现此错误: 问题是来自printf吗?我检查了格式,它看起来正确。 这是程序: 问题答案: 答:因为您的格式说明符与方法中使用的输入参数不匹配。 使用而不是将值用作格式说明符 另外需要额外的逃脱角色 最后,删除不必要的点字符 阅读:Formatter javadoc

  • 问题内容: 设计可能引发异常的单例类的最佳方法是什么? 在这里,我有一个Singleton(使用Bill Pugh的方法,在Wiki中为Singleton记录)。 如果在2处引发异常,我想将其传播给调用方。但是,我不能从第1行引发异常。 因此,如果单例对象创建不正确,我唯一的选择是返回空对象吗? 谢谢 PS我确实意识到,如果该Singleton通过不同的类加载器加载或反射加载,则可能会损坏,但是对