错误、调试、测试
错误处理
try
try:
print("try...")
result=10/0
print("result 10/0=", result)
except Exception as e: #捕获所有的异常
# raise #raise 语句不带参数 就会把错误原样抛出
print("error+", e)
else:
print("no erro") #没有错误发生时 执行
finally:
print("finally...")
print("end...")
# try...
# error+ division by zero
# finally...
# end...
根据捕捉不用类型的错误
try:
print('try...')
r = 10 / int('a')
print('result:', r)
except ValueError as e: #如果int()函数发生错误
print('ValueError:', e)
except ZeroDivisionError as e: # 发现除数为0错误
print('ZeroDivisionError:', e)
finally:
print('finally...')
print('END')
Python的错误也是class,所有错误继承自BaseException
,所以使用exception
时可以捕获所有其子类错误
捕获错误可以跨越多层调用,
如果错误没有被捕获,就会一级一级往上抛出,最后被Python解释器捕获,打印错误信息并退出程序的执行
发生错误时可以通过分析错误的调用异常栈,定位错误的位置信息
抛出错误
自定义错误类,抛出错误,尽量使用内置的错误类型,只有在必要时才需要定义自己的错误类型
调试
断言
断言使用assert
关键字
def my_func_div(s):
n=int(s)
assert n!=0, "n is zero"
return 10/n
my_func_div("0")
# AssertionError: n is zero
断言失败,assert
语句会抛出AssertionError
Python解释器可以通过 添加参数- O
参数关闭所有assert 这时assert
就可看做pass
logging
logging不会抛出错误,而且可以输出到文件
logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。
import logging
logging.basicConfig(level=logging.INFO)
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
logging语句允许指定记录信息的级别,共有
debug
info
warning
error
这几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
pdb 单步调试
pdb
是python解释器的调试器,可以让程序但不执行,可以随时查看运行的状态
s = '0'
n = int(s)
print(10 / n)
python -m pdb xxx.py
输入 l
查看diamante
n
单步执行代码
p 变量名
查看变量当前值
q
结束调试
pdb.set_trace() 断点
import pdb
在可能出错的地方放pdb.set_trace()
就设置了一个断点,程序会在断点处进入pdb调试环境 可以用c
继续执行