前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python捕获所有异常

Python捕获所有异常

作者头像
happy123.me
发布2019-12-30 18:11:13
3.3K0
发布2019-12-30 18:11:13
举报
文章被收录于专栏:乐享123乐享123

摘自 - Python cookbook

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

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

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

1 2 3 4 5

try: ... except Exception as e: ... log('Reason:', e) # Important!

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

讨论

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

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

1 2 3 4 5

def parse_int(s): try: n = int(v) except Exception: print("Couldn't parse")

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

1 2 3 4 5

>>> parse_int('n/a') Couldn't parse >>> parse_int('42') Couldn't parse >>>

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

1 2 3 4 5 6

def parse_int(s): try: n = int(v) except Exception as e: print("Couldn't parse") print('Reason:', e)

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

1 2 3 4

>>> parse_int('42') Couldn't parse Reason: global name 'v' is not defined >>>

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

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

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

1 2 3 4

try: .... except: os.remove(temp_file)

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

1 2 3 4

try: .... except Exception: os.remove(temp_file)

正确的办法是:

1 2 3 4

try: .... except BaseException: os.remove(temp_file)

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

1 2 3 4 5 6

try: .... except BaseException: logger.error(....) finally: os.remove(temp_file)

参考:

https://github.com/PyCQA/pycodestyle/issues/703

https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p07_catching_all_exceptions.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 怎样捕获代码中的所有异常?
    • 想要捕获所有的异常,可以直接捕获 Exception 即可:
      • 讨论
        • 最可怕的例子是我们在处理临时文件的时候,用
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档