Python异常处理机制、调试、测试
类似于java的try..catch..finally
java的为try_except_finally
try: print('try...') r = 10 / 0 print('result:', r) except zerodivisionerror as e: print('except:', e) finally: print('finally...') print('end')
try执行一段可能会发送异常的代码,如果有异常情况发送 走except , 如果没有则不走,最后不管代码有没有发送异常,都会执行finally里的代码
异常错误存在父子类问题,如果父类处理了,子类则不会再接收处理
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
调试
1、打印print
最简单的就是print 把数据打印出来再去找错误原因
问题在于会在代码中出现很多打印语句
2、断言assert
assert n != 0, 'n is zero!'
assert
的意思是,表达式n != 0
应该是true
,否则,根据程序运行的逻辑,后面的代码肯定会出错。
如果断言失败,assert
语句本身就会抛出assertionerror
:
$ python err.py traceback (most recent call last): ... assertionerror: n is zero!
注:
程序中如果到处充斥着assert
,和print()
相比也好不到哪去。不过,启动python解释器时可以用-o
参数来关闭assert
:
关闭后,你可以把所有的assert
语句当成pass
来看。
$ python -o err.py traceback (most recent call last): ... zerodivisionerror: division by zero
3、logging
logging
的好处,它允许你指定记录信息的级别,有debug
,info
,warning
,error
等几个级别,当我们指定level=info
时,logging.debug
就不起作用了。同理,指定level=warning
后,debug
和info
就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
logging
的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。
import logging logging.basicconfig(level=logging.info) s = '0' n = int(s) logging.info('n = %d' % n) print(10 / n)
-------------------------------------------- $ python err.py info:root:n = 0 traceback (most recent call last): file "err.py", line 8, in <module> print(10 / n) zerodivisionerror: division by zero