exception - 在一行中捕获多个异常( 除了块)

  显示原文与译文双语对照的内容

我知道我可以:


try:
 # do something that may fail
except:
 # do this if ANYTHING goes wrong

我也可以这样做:


try:
 # do something that may fail
except IDontLikeYourFaceException:
 # put on makeup or smile
except YouAreTooShortException:
 # stand on a ladder

但是如果我想在两个不同的例外中做同样的事情,我现在可以想到的最好的方法是:


try:
 # do something that may fail
except IDontLIkeYouException:
 # say please
except YouAreBeingMeanException:
 # say please

有什么方法可以让我像这样做( 因为在两个例外中采取的操作是 say please ):


try:
 # do something that may fail
except IDontLIkeYouException, YouAreBeingMeanException:
 # say please

现在,这将不起作用,因为它符合以下语法:


try:
 # do something that may fail
except Exception, e:
 # say please

所以,我捕获两个不同异常的努力并不是完全通过。

有什么方法可以做到?

时间:

用括号括起来:


except (IDontLIkeYouException, YouAreBeingMeanException) as e:
 pass

用逗号将异常与变量分离仍然可以在 python 2.6和 2.7中工作,但现在不推荐使用,并且在 python 3中不起作用;现在你应该使用 as

对于 python 2.5和更早版本,正确的语法是:


except (IDontLIkeYouException, YouAreBeingMeanException), e:
 print e

e 是异常实例。

最佳实践

目前这样做的方式和向前兼容 python, 你需要异常之间用逗号分隔,用括号来区分从语法,早些时候异常实例分配给一个变量名由异常类型被抓住后用逗号。 下面是一个简单的现代用法示例: 我目前包装 main KeyboardInterrupt的捕捉和EOFError,这样用户可以交互式键盘输入会话semi-gracefully留下 Ctrl + DCtrl + C :


try:
 mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary for Python 3
 quit(0)

我指定了这些例外以避免隐藏 Bug,如果我遇到了我期望从。

这里有文档:https://docs.python.org/tutorial/errors.html

你可以将异常分配给一个变量,( e 是常见的,但你可能更喜欢一个更详细的变量,如果你一直异常处理和ide强调选择比,和我一样。) 实例有一个args属性。 以下是一个示例:


try:
 mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
 print err
 print err.args
 quit(0)

弃用

你可能会看到用逗号分配错误的代码。 这里用法是 python 2.5和更早版本中可用的唯一形式,如果你希望代码在 python 3中向前兼容,则应该更新语法以使用新形式:


try:
 mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
 print err
 print err.args
 quit(0)

python 文档-> 8.3处理异常:

try 语句可能有多个除外子句,用于指定不同异常的处理程序。 至多会执行一个处理程序。 处理程序只处理在相应的珍娜子句中发生的异常,而不是在相同的try尝试statement语句的其他处理程序中处理异常。 除外子句可以将多个异常命名为带括号的元组,例如:


except (RuntimeError, TypeError, NameError):
 pass

注意,这个元组周围的括号是必需的,因为除了 ValueError, e: 是用来正常书写的语法 except ValueError as e: 在现代 python ( 描述如下) 中。 旧语法仍然支持向后兼容。 这意味着 except RuntimeError, TypeError 并不是 except (RuntimeError, TypeError):,而是 except RuntimeError asTypeError:,这不是你想要的。

...