python异常处理的优秀实践

        这个博文里代码片段的在一个星期前就写好,但一直没有发出来。因为专门写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)记录所有的异常堆栈信息,对之后的工作是很有帮组的。

猜你喜欢

转载自my.oschina.net/u/2255341/blog/866573