1 错误处理
1.1 捕获错误
try:
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('end')
# 结果:
except: division by zero
finally...
end
如果没有错误发生,可以在except语句块后面加上一个else,当没有错误发生时,会自动执行else语句。
try:
r = 10 / 2
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
else:
print('no error')
finally:
print('finally...')
print('end')
# 结果:
result: 5.0
no error
finally...
end
注意:
- 如果except有多个异常类,则只会捕获到父类的异常,属于这个父类的子类异常不会被捕获到。
- 如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印出一个错误学习,然后程序退出。
1.2 记录错误
import logging
try:
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
# 记录错误
logging.exception(e)
finally:
print('finally...')
print('end')
注意:出错后,程序打印完错误信息会继续执行,并正常退出。
1.3 抛出错误
# 定义一个错误的class,选择好继承关系
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n == 0:
# 抛出异常
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')
# 结果:最后能追踪到自定义的错误
Traceback (most recent call last):
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 28, in <module>
r = 10 / 0
ZeroDivisionError: division by zero
Traceback (most recent call last):
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 52, in <module>
foo('0')
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 48, in foo
raise FooError('invalid value: %s' % s)
__main__.FooError: invalid value: 0
注意:在except中抛出一个error,可以把一种类型的错误转换成另一种类型,只要是合理的转换逻辑就行。
try:
10 / 0
except ZeroDivisionError:
raise ValueError('input error')
2 调试
2.1 断言
def fee(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
fee('0')
main()
# 运行结果:
Traceback (most recent call last):
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 73, in <module>
main()
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 70, in main
fee('0')
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 65, in fee
assert n != 0, 'n is zero!'
AssertionError: n is zero!
注意:
- 如果断言失败,assert语句本身就会抛出AssertionError。
- 启动Python解释器时可以用 -0 参数来关闭 assert。
2.2 logging
logging不会抛出错误,而且可以输出到文件。
import logging
# 指定记录信息的级别
logging.basicConfig(level=logging.INFO)
s = '0'
n = int(s)
# 可以输出一段文本
logging.info('n=%d' % n)
print(10 / n)
# 结果:
INFO:root:n=0
Traceback (most recent call last):
File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 81, in <module>
print(10 / n)
ZeroDivisionError: division by zero
注意:
- logging允许指定记录信息的级别,有debug,info,warning,error等,当指定level=INFO时,logging.debug就不起作用了,同理其他也是。
2.3 pdb
不作介绍
2.4 使用IDE
使用PyCharm来开发,支持调试功能。
3 单元测试
单元测试,是用来对一个模块,一个函数或一个类来进行正确性检验的测试工作。