这个博文里代码片断的在一个星期前就写好,但一直没有发出来。由于专门写python异常处理的文章不是不少,不知道本身的处理是否是一个比较优秀的实践,但愿看到这个博文的人积极拍板,有什么异常处理的优秀实践也一块儿分享如下。我会持续的更新这篇博文,遇到新的优秀实践及时记录。python
1、坚定不能简单的忽略和隐藏捕获的异常。code
下面这段代码是一个反面的例子千万不能这么作,这样只是简单的吞掉捕获的异常,这回后续的工做带来很大的麻烦,可能让咱们没法定位到bug在什么地方。orm
try: do_something() except: #except Exception as e pass
2、尽可能捕捉特定的异常。get
尽可能捕捉特定的异常这也是PEP8的要求。当第一次写本身的代码的时候,作这件事是很简单,不过当清理别人的代码的时候,这可能变的万分痛苦。其实我一直在找处理这种状况的方法,我会在以后发现更好的实践的时候,来更新博文。有一个方法,把这部分交给那个对这一部分代码更熟悉的家伙。哈哈哈io
try: do_something() except ValueError: do_exception_deal()
3、当须要捕获全部异常的时候,要把相关的堆栈追踪信息记录下来不要仅仅记录一个错误信息。form
有些代码可能要捕获全部的异常,例如最顶层循环的长时间运行的代码。下面的代码提供一个相对不错的实践,使用logging或这tarceback记录异常相关的全部堆栈信息。class
#!/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)记录全部的异常堆栈信息,对以后的工做是颇有帮组的。import