python之错误、调试和测试

错误

基本错误类型

https://docs.python.org/2/library/exceptions.html#exception-hierarchy


try...except...finally

<span style="font-family:Microsoft YaHei;">try:
    print 'try...'
    r = 10 / 0
    print 'result:', r
except ZeroDivisionError, e:
    print 'except:', e
finally:
    print 'finally...'
print 'END'</span>

用logging记录错误

如果不捕获错误,自然可以让python的解释器来打印出错误堆栈,但程序也同时结束了
利用python内置的logiing模块可以非常容易地记录错误信息,同时让程序继续执行下去

<span style="font-family:Microsoft YaHei;">import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except StandardError, e:
        logging.exception(e)

main()
print 'END'</span>

raise抛出错误

只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型。

class FooError(StandardError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value: %s' % s)
    return 10 / n


调试

print 简单粗暴

assert

<span style="font-family:Microsoft YaHei;">def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    #assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。
    return 10 / n

def main():
    foo('0')</span>


测试

单元测试

单元测试:用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作,可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。

文档测试

doctest非常有用,不但可以用来测试,还可以直接作为示例代码
什么输出也没有。这说明我们编写的doctest运行都是正确的
当模块正常导入时,doctest不会被执行。只有在命令行运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。

<span style="font-family:Microsoft YaHei;">class Dict(dict):
    '''
    Simple dict but also support access as x.y style.

    >>> d1 = Dict()
    >>> d1['x'] = 100
    >>> d1.x
    100
    >>> d1.y = 200
    >>> d1['y']
    200
    >>> d2 = Dict(a=1, b=2, c='3')
    >>> d2.c
    '3'
    >>> d2['empty']
    Traceback (most recent call last):
        ...
    KeyError: 'empty'
    >>> d2.empty
    Traceback (most recent call last):
        ...
    AttributeError: 'Dict' object has no attribute 'empty'
    '''
    def __init__(self, **kw):
        super(Dict, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

if __name__=='__main__':
    import doctest
    doctest.testmod()</span>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值