本文环境
win7_64 + Python 2.7.10
异常定位
我们定义一个文件test.py
import sys
def f1():
f2()
def f2():
a = 1
b = 0
return a / b # Exception,这里是本文件的第九行
def main():
f1()
main()
当我们运行的时候,会出现如下错误:
Traceback (most recent call last):
File "test.py", line 14, in <module>
main()
File "test.py", line 12, in main
f1()
File "test.py", line 4, in f1
f2()
File "test.py", line 9, in f2
return a / b # Exception
ZeroDivisionError: integer division or modulo by zero
其中最后一个表示了在test.py
文件的第九行出现了错误
再看下面的try...except
语句
import sys
def f1():
f2()
def f2():
a = 1
b = 0
return a / b # Exception
def main():
f1()
try:
main()
except Exception as e:
print(e)
一般情况下,我们通过try...except
语句捕获异常后,只获取到了异常的值(例子中的e
),此时我们看不出来到底是哪里引发的异常,python提供了traceback
模块用于异常地位,可以方便的打印异常引发的信息。
t.py
def f2():
a = 1
b = 0
return a / b # Exception
test.py
import sys
import t
import traceback
def f1():
t.f2()
def main():
f1()
try:
main()
except Exception as e:
traceback.print_exc()
执行结果:
Traceback (most recent call last):
File "test.py", line 12, in <module>
main()
File "test.py", line 9, in main
f1()
File "test.py", line 6, in f1
t.f2()
File "C:\Users\linlei\Desktop\t.py", line 4, in f2
return a / b # Exception
ZeroDivisionError: integer division or modulo by zero
总结
- 通过
traceback
模块的print_exc()
函数,可以快速的定位引发异常的地点,对于try...except
语句里面定位异常很有用。 - 当然我们还可以通过
sys
模块的exc_traceback
对象或者exc_info()
来获取更多有效的信息,会有单独的文章来描述