2009-08-18 9 views
7

this questionから、私はエラーを1レベル下に処理しています。つまり、私は別のより大きな関数を呼び出す関数を呼び出し、より小さな関数ではなく、その大きな関数でどこが失敗したのかを求めます。具体例。コードは次のとおりです。例外が発生した場合、前のフレームのタイプ、ファイル、行番号を取得するにはどうすればよいですか?

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 ")(workerFuncを印刷" である - 私はその行が失敗したけど、私は前の行をしたい:

Error: ZeroDivisionError,tmp2.py,4 

答えて

4

行を追加:

tb = tb.tb_next 

012に電話した直後。

「トレースバックオブジェクト」のドキュメントhereを参照してください。

2

トレースバックの下部を見つける必要があります。フレームがなくなるまでループする必要があります。これを実行して、必要なフレームを見つけます。

while tb.tb_next: 
    tb = tb.tb_next 

sys.exc_infoの後。これにより、コールフレームが何回発生したかに関係なく、例外が検出されます。

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