1、调用栈
如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
输出结果:
Traceback (most recent call last):
File "D:/PycharmProjects/pachong/input.py", line 10, in <module>
main()
File "D:/PycharmProjects/pachong/input.py", line 8, in main
bar('0')
File "D:/PycharmProjects/pachong/input.py", line 5, in bar
return foo(s) * 2
File "D:/PycharmProjects/pachong/input.py", line 2, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置。
错误信息第1行:
Traceback (most recent call last):
告诉我们这是错误的跟踪信息。
第2~3行:
File "D:/PycharmProjects/pachong/input.py", line 10, in <module>
main()
调用main()
出错了,在代码文件input.py
的第10行代码,但原因是第8行:
File "D:/PycharmProjects/pachong/input.py", line 8, in main
bar('0')
调用bar('0')
出错了,在代码文件input.py
的第8行代码,但原因是第5行:
File "D:/PycharmProjects/pachong/input.py", line 5, in bar
return foo(s) * 2
原因是return foo(s) * 2
这个语句出错了,但这还不是最终原因,继续往下看:
File "D:/PycharmProjects/pachong/input.py", line 2, in foo
return 10 / int(s)
原因是return 10 / int(s)
这个语句出错了,这是错误产生的源头,因为下面打印了:
ZeroDivisionError: division by zeroo
根据错误类型ZeroDivisionError
,可以判断,int(s)
本身并没有出错,但是int(s)
返回0
,在计算10 / 0
时出错,至此,找到错误源头。