gpt4 book ai didi

python - 最好 'try' 一些东西并捕获异常或测试是否可以首先避免异常?

转载 作者:IT老高 更新时间:2023-10-28 12:34:58 24 4
gpt4 key购买 nike

我应该测试 if 某事是否有效,还是只测试 try 来执行它并捕获异常?

  • 是否有任何可靠的文档表明首选一种方法?
  • 还有一种方式 pythonic

例如,我应该:

if len(my_list) >= 4:
x = my_list[3]
else:
x = 'NO_ABC'

或者:

try:
x = my_list[3]
except IndexError:
x = 'NO_ABC'

一些想法...
PEP 20说:

Errors should never pass silently.
Unless explicitly silenced.

是否应该将使用 try 而不是 if 解释为静默传递的错误?如果是这样,您是否通过以这种方式使用它来明确地使其静音,从而使其正常?


不是指的是你只能以一种方式做事的情况;例如:

try:
import foo
except ImportError:
import baz

最佳答案

你应该更喜欢 try/except超过 if/else如果这导致

  • 加速(例如通过防止额外的查找)
  • 更简洁的代码(行更少/更易于阅读)

通常,这些是齐头并进的。


加速

在尝试通过以下方式在长列表中查找元素的情况下:

try:
x = my_list[index]
except IndexError:
x = 'NO_ABC'

尝试,除非是 index 时的最佳选择可能在列表中,通常不会引发 IndexError。这样您就无需通过 if index < len(my_list) 进行额外查找。 .

Python 鼓励使用异常,你自己处理 是来自 Dive Into Python 的短语.您的示例不仅(优雅地)处理异常,而不是让它静默通过,而且异常仅在未找到索引的异常情况下发生(因此单词异常(exception)!)。


更简洁的代码

官方 Python 文档提到 EAFP : 请求宽恕比请求许可更容易Rob Knight注意到捕获错误而不是避免它们,可以使代码更清晰、更易于阅读。他的例子是这样说的:

更糟 (LBYL '在你跳跃之前先看看'):

#check whether int conversion will raise an error
if not isinstance(s, str) or not s.isdigit():
return None
elif len(s) > 10: #too many digits for int conversion
return None
else:
return int(s)

更好(EAFP:请求宽恕比请求许可更容易):

try:
return int(s)
except (TypeError, ValueError, OverflowError): #int conversion failed
return None

关于python - 最好 'try' 一些东西并捕获异常或测试是否可以首先避免异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com