python try except捕获所有异常_Python捕获所有异常

摘自 – Python cookbook

老生常谈了,但是在Pyflake检查出E722错误时有时候又犯老毛病。人年纪大了越来越有老年痴呆倾向 –_– …..

怎样捕获代码中的所有异常?

想要捕获所有的异常,可以直接捕获 Exception 即可:

try:

...

except Exception as e:

...

log('Reason:', e) # Important!

这个将会捕获除了SystemExit

、KeyboardInterrupt

和GeneratorExit

之外的所有异常。 如果你还想捕获这三个异常,将 Exception 改成 BaseException 即可。

讨论

捕获所有异常通常是由于 程序员 在某些复杂操作中并不能记住所有可能的异常。 如果你不是很细心的人,这也是编写不易调试代码的一个简单方法。

正因如此,如果你选择捕获所有异常,那么在某个地方(比如日志文件、打印异常到屏幕)打印确切原因就比较重要了。 如果你没有这样做,有时候你看到异常打印时可能摸不着头脑,就像下面这样:

def parse_int(s):

try:

n = int(v)

except Exception:

print("Couldn't parse")

试着运行这个函数,结果如下:

>>> parse_int('n/a')

Couldn't parse

>>> parse_int('42')

Couldn't parse

>>>

这时候你就会挠头想:“这咋回事啊?” 假如你像下面这样重写这个函数:

def parse_int(s):

try:

n = int(v)

except Exception as e:

print("Couldn't parse")

print('Reason:', e)

这时候你能获取如下输出,指明了有个编程错误:

>>> parse_int('42')

Couldn't parse

Reason: global name 'v' is not defined

>>>

很明显,你应该尽可能将异常处理器定义的精准一些。

不过,要是你必须捕获所有异常,确保打印正确的诊断信息或将异常传播出去,这样不会丢失掉异常。

最可怕的例子是我们在处理临时文件的时候,用

try:

....

except:

os.remove(temp_file)

因为碍人的E722, 有人会自作聪明的改成:

try:

....

except Exception:

os.remove(temp_file)

正确的办法是:

try:

....

except BaseException:

os.remove(temp_file)

或者更确定的语义之下,每次都清理临时文件,这样更明确,处理更好一点:

try:

....

except BaseException:

logger.error(....)

finally:

os.remove(temp_file)

参考:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值