oDivisionError: division by zero
END # 继续执行了
- 通过配置,
logging
还可以把错误记录到日志文件里,方便事后排查
(4.3).自定义抛出raise错误
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 "err_throw.py", line 11, in <module>
foo('0')
File "err_throw.py", line 8, in foo
raise FooError('invalid value: %s' % s)
__main__.FooError: invalid value: 0
5. 调试
方法 |
优点 |
缺点 |
print方法 |
简单使用 |
重复多 |
assert |
简单使用 |
重复多 |
logging |
不会抛出错误,可以输入文档 |
重复多 |
pdb |
python内置调试器 |
重复多 |
VS Code |
强强强 |
|
(5.1).print方法(略过)
(5.2).断言assert
凡是用print()
来辅助查看的地方,都可以用断言(assert)
来替代:
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
foo('0')
# 结果
Traceback (most recent call last):
...
AssertionError: n is zero!
assert
的意思是,表达式n != 0
应该是True
,否则,根据程序运行的逻辑,后面的代码肯定会出错。如果断言失败,assert
语句本身就会抛出AssertionError
(5.3).logging
把print()
替换为logging
是第3种方式,和assert
比,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 "err.py", line 8, in <module>
print(10 / n)
ZeroDivisionError: division by zero
logging可以指定不同信息的级别
(5.4).pdb.set_trace()
我们只需要import pdb
,然后,在可能出错的地方放一个pdb.set_trace()
,就可以设置一个断点
import pdb
s = '0'
n = int(s)
# 暂停并进入pdb调试环境
pdb.set_trace() # 运行到这里会自动暂停
print(10 / n)
(5.5). IDE
直接在代码中设置断掉调试
graph TD; A-->B; A-->C; B-->D; C-->D;