python异常处理的优秀实践

        这个博文里代码片断的在一个星期前就写好,但一直没有发出来。由于专门写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

相关文章
相关标签/搜索