【问题标题】:Are try except clauses idiomatically discouraged in Python when avoidable? [duplicate]在可以避免的情况下,Python 中是否不鼓励使用 try except 子句? [复制]
【发布时间】:2016-06-24 16:40:10
【问题描述】:

如果可以避免使用 try except 子句并且它是正常运行的代码的一部分,那么 Python 中是否不鼓励使用 try except 子句?比如下面两个代码sn-ps,哪个是首选?

选项 1:

try:
    id = list.index(42)
except:
    print("42 not found")
else:
    print("ID: ", id)

选项 2:

if 42 in list:
    id = list.index(42)
    print("ID: ", id)
else:
    print("42 not found")

【问题讨论】:

  • 不,他们不是。 python中推荐的设计原则是EAFP,而不是LBYL,见Python Glossary
  • 仅供参考:EAFP: 请求宽恕比请求许可更容易,LBYL: 跳之前先看看
  • 嗯,实际上除了简单的检查之外,程序可能还有更多问题。事实上 try/catch 被鼓励并且被认为是好的做法。
  • 关于良好 Python 风格的主题 - 不要以标准类型名称命名变量,这可能很诱人。所以没有名为“list”的列表、名为“dict”的字典、名为“tuple”的元组或名为“str”的字符串。
  • @PaulMcGuire 你甚至不应该命名字符串list、字典str 或列表dict:P

标签: python idioms try-except


【解决方案1】:

他们并不气馁。

但是,您的示例很愚蠢,因为您不需要异常,例如,您可能会在 list.index 代码中意外输入错误,这会触发您的异常,而您永远不会知道。

如果您知道要捕获什么异常,请使用异常并捕获它们——并且进行“跳前检查”检查并非易事(就像在您的示例中一样)。通常情况并非如此。但是,在您的示例中是这样。

哦,请尽量避免被except: 捕获(尤其是如果您知道如何您希望您的try 失败)。这很容易导致不好的做法,因为根据定义,你几乎不知道你的跟注可能会做什么/加注。如果您的应用程序需要(例如 Paul 在 cmets 中指出的服务器示例),那很好,但如果您尝试在列表中查找值?那……不好。

作为一个很好的例子来说明为什么这对你的例子来说不是很好的组合:

try:
    id = list.idex(42)
except:
    print("42 not found")
else:
    print("ID: ", id)

【讨论】:

  • 我不同意。 except Exception: 是无可避免的,它经常用于服务器应用程序中,以避免因代码行为不当而导致长时间运行的服务崩溃。要避免的情况是裸露的except:,更糟糕的是except: pass,它确实 捕获所有异常,然后愉快地跋涉。杀手锏是 except: 还捕获了您通常希望通过的异常,例如 KeyboardInterrupt(按 ^C 时)或 SysExit - except: pass 在 while-True-loop 中会导致难以杀死的程序。
  • @PaulMcGuire 我澄清要解决这个问题 - 当我第一次写这篇文章时,我错误地将 Exception: 而不是 except:...
【解决方案2】:

一切都取决于您的需求:

如果您对性能有很大的依赖,不鼓励使用try-except 子句。

否则,您可以使用try-except 子句作为明确的模式。

无论如何,在您的示例中,我认为if-else 代码比try-except 更清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2016-08-05
    • 2014-08-23
    相关资源
    最近更新 更多