Python学习 (七 错误、调试和测试)

前言:有的错误是程序编写有问题造成的,有的错误是用户输入造成的,还有一类错误是完全无法在程序运行过程中预测的,这类错误也称为异常。跟踪程序的执行,查看变量的值是否正确,这个过程称为调试,Python的pdb可以让我们以单步方式执行代码。良好的测试,可以在程序修改后反复运行,确保程序输出符合我们编写的测试。

7.1 错误处理

Python内置了try...except...finally的错误处理机制,避免逐级上报的麻烦。

try

try:
    print 'try...'
    r = 10 / 0
    print 'result:', r
except ZeroDivisionError, e: #e相当于一种赋值?
    print 'except:', e
finally:
    print 'finally...'
print 'END'

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。
概括就是,觉得可能发生错误,用tryexcept后写上错误类型和执行语句(e?),有finally必执行(不管有没有except),注意:使用!结果如下:

try...
except: integer division or modulo by zero
finally...
END

错误类型可以捕获,except后的自动识别,所以为了准确捕获,可以多加几个,也就是多几个except,至于错误类型有哪些,好好阅读官方文档吧= = 没有错误可以在except后加else,然而我觉得如果是个返回值的话,并没有什么必要,具体情况具体分析吧。
Python的错误是class,全部继承自BaseException,所以在使用错误类型时要注意,子类会被判断进去哦~如:

try:
    foo()
except StandardError, e:
    print 'StandardError'
except ValueError, e:
    print 'ValueError'

第二个except永远无法捕获到ValueError,因为它是StandError的子类,继承关系在这:https://docs.python.org/2/library/exceptions.html#exception-hierarchy
使用try...except一个巨大的好处就是可以跨越多层调用。就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。
要点:

  • try...except...finally语句执行顺序与规则
  • 错误是一种class,注意父类与子类
  • 跨多层调用,合适地方加入即可

调用堆栈

如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出

# err.py:
def foo(s):
    return 10 / int(s)

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

def main():
    bar('0')

main()
$ python err.py
Traceback (most recent call last): 逐层抛错,直到可以识别的错误类型与最终源头
  File "err.py", line 11, in <module>
    main()
  File "err.py", line 9, in main
    bar('0')
  File "err.py", line 6, in bar
    return foo(s) * 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值