python 高级用法 -- 错误、调试和测试
Prerequisite
参考文章:廖雪峰的文章
常用异常(中文分析):Python 异常处理
错误处理
常见写法(以处理全部异常 Exception,与断言语句失败 AssertionError 为例)
# 处理全部异常
try:
a = '2' + 2
except Exception as e:
print(e)
# 不追踪错误写法
# finally 语句写不写都行,但写了一定会执行
def function():
try:
a = 100
assert a == 10
except AssertionError as e:
print("断言语句异常")
finally:
print("End")
function()
"""
断言语句异常
End
"""
# 追踪错误写法
def function():
try:
a = 100
assert a == 10
except:
raise AssertionError("断言语句异常") from None
finally:
print("End")
function()
"""
Traceback (most recent call last):
File "C:\Users\WPS\Desktop\Temporary\test.py", line 19, in <module>
function()
File "C:\Users\WPS\Desktop\Temporary\test.py", line 15, in function
raise AssertionError("断言语句异常")
AssertionError: 断言语句异常
"""
更多规则
# 捕获多个异常
try:
print('try...')
r = 10 / int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
# 如果没有错误发生
else:
print('no error!')
finally:
print('finally...')
print('END')
调试
方法有 print、assert、logging、pdb、IDE 等,但我只用 logging
import logging
logging.basicConfig(level=logging.DEBUG)
s = '0'
n = int(s)
logging.debug('n = %d' % n)
print(10 / n)
"""
DEBUG:root:n = 0
Traceback (most recent call last):
File "c:\Users\WPS\Desktop\Temporary\test.py", line 80, in <module>
print(10 / n)
ZeroDivisionError: division by zero
"""
# 注意除了打印报错信息,n 也打印出来了
# 如果开头 logging 的配置换成如下
logging.basicConfig(level=logging.INFO)
# 那么就不会打印出 n 了
可替换的地方有开头 level=logging.DEBUG
和报错语句 logging.debug()
显示报错的等级为:debug < info < warning < error
选定开头的报错等级,那么报错语句在这个等级以下的,都会显示报错(如果语句报错了)
单元测试
基本是测试 python 代码的,使用到了 unittest 模块,内置许多用于测试的函数,如 assertEqual 检验是否相等、assertRaises 检验是否抛出相同异常
我觉得用不到,就不写了
文档测试
讲的是写文档时注释放的是代码执行示例, 如果要执行的化可以用 doctest 模块
用不到 +2,也不写了
喜欢划水摸鱼的废人