【Python进阶】异常定位

本文环境

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 
    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 
    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

总结

  1. 通过traceback模块的print_exc()函数,可以快速的定位引发异常的地点,对于try...except语句里面定位异常很有用。
  2. 当然我们还可以通过sys模块的exc_traceback对象或者exc_info()来获取更多有效的信息,会有单独的文章来描述

你可能感兴趣的:(【Python进阶】异常定位)