这个博文里代码片段的在一个星期前就写好,但一直没有发出来。因为专门写python异常处理的文章不是很多,不知道自己的处理是不是一个比较优秀的实践,希望看到这个博文的人积极拍板,有什么异常处理的优秀实践也一起分享以下。我会持续的更新这篇博文,遇到新的优秀实践及时记录。
一、坚决不能简单的忽略和隐藏捕获的异常。
下面这段代码是一个反面的例子千万不能这么做,这样只是简单的吞掉捕获的异常,这回后续的工作带来很大的麻烦,可能让我们无法定位到bug在什么地方。
try:
do_something()
except: #except Exception as e
pass
二、尽量捕捉特定的异常。
尽量捕捉特定的异常这也是PEP8的要求。当第一次写自己的代码的时候,做这件事是很简单,不过当清理别人的代码的时候,这可能变的万分痛苦。其实我一直在找处理这种情况的方法,我会在之后发现更好的实践的时候,来更新博文。有一个方法,把这部分交给那个对这一部分代码更熟悉的家伙。哈哈哈
try:
do_something()
except ValueError:
do_exception_deal()
三、当需要捕获所有异常的时候,要把相关的堆栈追踪信息记录下来不要仅仅记录一个错误信息。
有些代码可能要捕获所有的异常,例如最顶层循环的长时间运行的代码。下面的代码提供一个相对不错的实践,使用logging或这tarceback记录异常相关的所有堆栈信息。
#!/usr/bin/python3
import logging
import time
import traceback
import sys
logging.basicConfig(level=logging.INFO)
def log_traceback(ex):
tb_lines = traceback.format_exception(ex.__class__, ex, ex.__traceback__)
tb_text = ''.join(tb_lines)
print(tb_text)
def get_number(arg):
return int(arg)
try:
get_number("hello")
except Exception as e:
# logging.exception(e) #使用logging模块的exception方法去打印tarceback
log_traceback(e) #使用traceback模块去输出traceback。
for i in range(10):
time.sleep(1)
logging.info("hello")
使用 # logging.exception(e) 或者 log_traceback(e)记录所有的异常堆栈信息,对之后的工作是很有帮组的。