当我捕获异常时,如何获取前一帧的类型,文件和行号?

时间:2009-08-18 02:08:47

标签: python exception exception-handling error-handling

this question开始,我现在正在进行一级错误处理。也就是说,我调用一个调用另一个更大函数的函数,我希望它在更大的函数中失败,而不是在较小的函数中。具体的例子。代码是:

import sys, os

def workerFunc():
    return 4/0

def runTest():
    try:
        print workerFunc()
    except:
        ty,val,tb = sys.exc_info()
        print "Error: %s,%s,%s" % (
            ty.__name__,
            os.path.split(tb.tb_frame.f_code.co_filename)[1],
            tb.tb_lineno)

runTest()

输出是:

Error: ZeroDivisionError,tmp2.py,8

但第8行是“print workerFunc()” - 我知道该行失败了,但我想要之前的行:

Error: ZeroDivisionError,tmp2.py,4

3 个答案:

答案 0 :(得分:4)

添加一行:

    tb = tb.tb_next
在您致电sys.exc_info之后

请参阅“追溯对象”下的文档here

答案 1 :(得分:3)

tb.tb_next是你的朋友:

import sys, os

def workerFunc():
    return 4/0

def runTest():
    try:
        print workerFunc()
    except:
        ty,val,tb = sys.exc_info()
        print "Error: %s,%s,%s" % (
            ty.__name__,
            os.path.split(tb.tb_frame.f_code.co_filename)[1],
            tb.tb_next.tb_lineno)

runTest()

但是traceback module做到了这一点以及更多:

import traceback

def workerFunc():
    return 4/0

def runTest():
    try:
        print workerFunc()
    except:
        print traceback.format_exc()

runTest()

答案 2 :(得分:2)

您需要找到回溯的底部,因此您需要循环直到没有更多帧。这样做是为了找到你想要的框架:

while tb.tb_next:
    tb = tb.tb_next

在sys.exc_info之后。无论发生了多少个调用帧,都会发现异常。