博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天打卡python面试题 - 在一行中捕获多个异常(块除外)
阅读量:2000 次
发布时间:2019-04-28

本文共 2142 字,大约阅读时间需要 7 分钟。

有什么办法可以做这样的事情(因为在两个异常中都采取的措施是say please):

try:    # do something that may failexcept IDontLikeYouException, YouAreBeingMeanException:    # say please

现在,这确实不起作用

可以如下这么做

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

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

最佳实践

要以当前方式并与Python向前兼容的方式执行此操作,您需要使用逗号分隔Exceptions,并用括号将其包裹起来,以区别于早期的语法,后者通过遵循Exception类型来将异常实例分配给变量名称,以将其捕获为逗号。

这是一个简单用法的示例:

import systry:    mainstuff()except (KeyboardInterrupt, EOFError): # the parens are necessary    sys.exit(0)

我仅指定这些异常以避免隐藏错误,如果遇到错误,我希望从中获得完整的堆栈跟踪。

在此处进行记录:https : //docs.python.org/tutorial/errors.html

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

import systry:    mainstuff()except (KeyboardInterrupt, EOFError) as err:    print(err)    print(err.args)    sys.exit(0)

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

不推荐使用

您可能会看到用逗号分配错误的代码。不赞成使用此用法,这是Python 2.5及更早版本中唯一可用的形式,如果您希望代码在Python 3中向前兼容,则应更新语法以使用新形式:

import systry:    mainstuff()except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+    print err    print err.args    sys.exit(0)

如果在代码库中看到逗号名称分配,并且您正在使用Python 2.5或更高版本,请切换到新的方式来执行此操作,以便在升级时代码保持兼容。

suppress上下文管理器

可接受的答案实际上是至少4行代码:

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

tryexceptpass线可以与单线处理抑制上下文管理器,可以在Python 3.4:

from contextlib import suppresswith suppress(IDontLikeYouException, YouAreBeingMeanException):     do_something()

因此,当您想pass在某些例外情况下使用suppress

从Python文档-> 8.3处理异常:

一条try语句可能具有多个except子句,以指定不同异常的处理程序。最多将执行一个处理程序。处理程序仅处理在相应的try子句中发生的异常,而不处理同一try语句的其他处理程序中的异常。exclude子句可以将多个异常命名为带括号的元组,例如:

except (RuntimeError, TypeError, NameError):    pass

请注意,必须在该元组周围加上括号,因为ValueError, e:用于except ValueError as e:现代Python中通常编写的语法除外(如下所述)。为了向后兼容,仍支持旧语法。这意味着except RuntimeError, TypeError不等于 except (RuntimeError, TypeError):except RuntimeError as TypeError:不是您想要的。

相关链接:

[一行捕获多个异常] https://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block

优质文章,推荐阅读:

转载地址:http://cobtf.baihongyu.com/

你可能感兴趣的文章
花了 500块大洋 ,买来的677页Java性能调优笔记,感觉4年Java性能调优都白学了
查看>>
Android之Retrofit基本用法篇
查看>>
Netty与网络协议资料整理
查看>>
golang实现大数据量文件的排序
查看>>
golang中的time包
查看>>
2019NOIP D4题 加工领奖
查看>>
2021.5.19 JS高级第二天
查看>>
SpringBoot内置Tomcat配置参数
查看>>
linux 根目录下文件夹分析
查看>>
linux 查看分区和文件大小
查看>>
技术转管理?这些“坑”你要绕道走
查看>>
领域驱动设计(DDD)前夜:面向对象思想
查看>>
Camera驱动调试小记
查看>>
四线触摸屏原理
查看>>
C/C++如何返回一个数组/指针
查看>>
腾讯AI语音识别API踩坑记录
查看>>
安装openrave 0.9的各种依赖包
查看>>
@FeignClient注解的重复名称解决
查看>>
java.net.BindException: 无法指定被请求的地址
查看>>
scala list
查看>>