2009-08-18 6 views
7

De this question, je suis en train de faire des erreurs de niveau inférieur. C'est-à-dire, j'appelle une fonction qui appelle une autre fonction plus grande, et je veux où elle a échoué dans cette fonction plus grande, pas dans la plus petite fonction. Exemple spécifique Code est:Lorsque j'attrape une exception, comment obtenir le type, le fichier et le numéro de ligne de l'image précédente?

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

sortie est:

Error: ZeroDivisionError,tmp2.py,8 

mais la ligne 8 est "imprimer workerFunc()" - Je sais que la ligne a échoué, mais je veux la ligne avant:

Error: ZeroDivisionError,tmp2.py,4 

Répondre

4

Ajouter une ligne:

tb = tb.tb_next 

juste après votre appel à sys.exc_info.

Voir les documents here sous "Objets Traceback".

2

Vous devez trouver le bas de la traceback, vous devez donc boucler jusqu'à ce qu'il n'y ait plus d'images. Pour ce faire, recherchez le cadre que vous souhaitez:

while tb.tb_next: 
    tb = tb.tb_next 

après sys.exc_info. Cela permettra de trouver l'exception, peu importe le nombre d'images appelées.

3

tb.tb_next est votre ami:

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

Mais le traceback module fait cela, et bien plus:

import traceback 

def workerFunc(): 
    return 4/0 

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

runTest() 
Questions connexes