从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
答案 0 :(得分:4)
答案 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之后。无论发生了多少个调用帧,都会发现异常。