[Python] 在一行中捕获多个异常(块除外)


Answers

如何在一行中捕获多个异常(块除外)

做这个:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

由于使用逗号将错误对象分配给名称的较旧语法,因此需要括号。 as关键字用于分配。 您可以使用任何名称作为错误对象,我个人更喜欢error

最佳实践

为了以与Python兼容的方式进行操作,需要用逗号分隔异常,并用圆括号将它们包装起来,以区别于将异常实例指定为变量名的先前语法,方法是按照异常类型来捕获逗号。

下面是一个简单用法的例子:我目前正在用交互式命令行PythonTrainer程序PythonTrainer主程序,并捕获KeyboardInterrupt和EOFError,以便用户可以使用Ctrl + DCtrl + C半正式地保留交互式键盘输入会话。 C

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

我只指定了这些例外以避免隐藏错误,如果遇到我期望的完整堆栈跟踪。

这是在这里记录: https://docs.python.org/tutorial/errors.htmlhttps://docs.python.org/tutorial/errors.html

您可以将异常分配给变量( e很常见,但如果您有很长时间的异常处理,或者您的IDE只会突出显示比这更大的选择,那么您可能更喜欢更详细的变量)。该实例具有args属性。 这里是一个例子:

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

请注意,在Python 3中,当except块结束时, err对象超出范围。

弃用

您可能会看到用逗号分配错误的代码。 这种用法是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 2.5或更高版本,请切换到新的方式,以便升级时代码保持兼容。

suppress上下文管理器

被接受的答案实际上是4行代码,最小值为:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

except pass线excepttry 可以用Python 3.4中suppress context manager来处理:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

所以当你想pass某些异常时,使用suppress

Question

我知道我可以这样做:

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

我也可以这样做:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
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

所以,我努力去捕捉这两个明显的例外并不完全一样。

有没有办法做到这一点?




Python文档 - > 8.3处理异常

try语句可能有多个except子句,用于为不同的异常指定处理程序。 最多只有一个处理程序将被执行。 处理程序只处理发生在相应try子句中的异常,而不处理相同t​​ry语句的其他处理程序。 except子句可以将多个异常命名为括号化的元组,例如:

except (RuntimeError, TypeError, NameError):
    pass

请注意,此元组周围的圆括号是必需的,因为除了ValueError, e:之外ValueError, e:是用于except ValueError as e:通常以书面形式使用的语法, except ValueError as e:在现代Python中所描述的(如下所述)。 旧的语法仍支持向后兼容性。 这意味着except RuntimeError, TypeError不等同于except (RuntimeError, TypeError):但将except RuntimeError as TypeError: except RuntimeError as TypeError:这不是您想要的。




其中一种方法是...

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

另一种方法是创建一个方法,执行exceptexcept任务,并通过你写的所有except块来调用它。

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

我知道第二个不是这样做的最好方式,但我只是展示了很多方法来做这件事。




Links