内容简介:摘自 – Python cookbook老生常谈了,但是在Pyflake检查出E722错误时有时候又犯老毛病。人年纪大了越来越有老年痴呆倾向 –_– …..这个将会捕获除了
摘自 – 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)
参考:
https://github.com/PyCQA/pycodestyle/issues/703
https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p07_catching_all_exceptions.html
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Remote
Jason Fried、David Heinemeier Hansson / Crown Business / 2013-10-29 / CAD 26.95
The “work from home” phenomenon is thoroughly explored in this illuminating new book from bestselling 37signals founders Fried and Hansson, who point to the surging trend of employees working from hom......一起来看看 《Remote》 这本书的介绍吧!