2009-08-18 12 views
7

Da this question, ora eseguo la gestione degli errori a un livello inferiore. Cioè, chiamo una funzione che chiama un'altra funzione più grande, e voglio dove è fallita in quella funzione più grande, non nella funzione più piccola. Esempio specifico Codice è:Quando rilevo un'eccezione, come ottengo il tipo, il file e il numero di riga del fotogramma precedente?

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

uscita è:

Error: ZeroDivisionError,tmp2.py,8 

ma la linea 8 è "stampare workerFunc()" - So che la linea non è riuscito, ma voglio la linea prima:

Error: ZeroDivisionError,tmp2.py,4 

risposta

4

Aggiungere una riga:

tb = tb.tb_next 

subito dopo la chiamata al sys.exc_info.

Vedere i documenti here in "Oggetti di tracciamento".

2

È necessario trovare la parte inferiore del traceback, quindi è necessario andare in loop finché non ci sono più frame. Fai questo per trovare il frame che desideri:

while tb.tb_next: 
    tb = tb.tb_next 

dopo sys.exc_info. Questo troverà l'eccezione, indipendentemente dal numero di frame di chiamata che è successo.

3

tb.tb_next è tuo amico:

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

Ma la traceback module fa questo e molto di più:

import traceback 

def workerFunc(): 
    return 4/0 

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

runTest() 
Problemi correlati