2013-01-25 19 views
31

Używam Pythona do oceny niektórych danych pomiarowych. Ze względu na wiele możliwych rezultatów jest to trudne do obsłużenia lub możliwych kombinacji. Czasami błąd występuje podczas oceny. Zwykle jest to błąd indeksu, ponieważ wydostaję się poza zakres mierzonych danych.Obsługa wyjątków w Pythonie - numer linii

Bardzo trudno jest ustalić, w którym miejscu kodu wystąpił problem. Bardzo by mi to pomogło, gdybym wiedział, w którym wierszu powstał błąd. Jeśli użyję następującego kodu:

try: 
    result = evaluateData(data) 
except Exception, err: 
    print ("Error: %s.\n" % str(err)) 

Niestety to tylko informuje mnie, że istnieje i błąd indeksu. Chciałbym poznać więcej szczegółów na temat wyjątku (wiersz w kodzie, zmiennej itp.), Aby dowiedzieć się, co się stało. Czy to możliwe?

Dziękuję.

+1

Zobacz http://stackoverflow.com/questions/3702675/print-full-traceback-in-python-without-halting-the-program! –

+0

https://docs.python.org/2/library/traceback.html#traceback-examples – osa

+2

@JeCh Odpowiedzi wyglądają dobrze. Zaakceptuj jedną. Aby go zaakceptować, kliknij pusty znacznik wyboru obok odpowiedzi. –

Odpowiedz

16

Aby po prostu uzyskać numer linii, możesz użyć numeru sys, jeśli chcesz mieć więcej, wypróbuj moduł traceback.

import sys  
try: 
    [][2] 
except IndexError: 
    print 'Error on line {}'.format(sys.exc_info()[-1].tb_lineno) 

drukuje:

Error on line 3 

Example from the traceback module documentation:

import sys, traceback 

def lumberjack(): 
    bright_side_of_death() 

def bright_side_of_death(): 
    return tuple()[0] 

try: 
    lumberjack() 
except IndexError: 
    exc_type, exc_value, exc_traceback = sys.exc_info() 
    print "*** print_tb:" 
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) 
    print "*** print_exception:" 
    traceback.print_exception(exc_type, exc_value, exc_traceback, 
           limit=2, file=sys.stdout) 
    print "*** print_exc:" 
    traceback.print_exc() 
    print "*** format_exc, first and last line:" 
    formatted_lines = traceback.format_exc().splitlines() 
    print formatted_lines[0] 
    print formatted_lines[-1] 
    print "*** format_exception:" 
    print repr(traceback.format_exception(exc_type, exc_value, 
              exc_traceback)) 
    print "*** extract_tb:" 
    print repr(traceback.extract_tb(exc_traceback)) 
    print "*** format_tb:" 
    print repr(traceback.format_tb(exc_traceback)) 
    print "*** tb_lineno:", exc_traceback.tb_lineno 
50

rozwiązanie, drukowania pliku, LineNumber sama linia i wyjątkiem descrition:

import linecache 
import sys 

def PrintException(): 
    exc_type, exc_obj, tb = sys.exc_info() 
    f = tb.tb_frame 
    lineno = tb.tb_lineno 
    filename = f.f_code.co_filename 
    linecache.checkcache(filename) 
    line = linecache.getline(filename, lineno, f.f_globals) 
    print 'EXCEPTION IN ({}, LINE {} "{}"): {}'.format(filename, lineno, line.strip(), exc_obj) 


try: 
    print 1/0 
except: 
    PrintException() 

wyjściowa:

EXCEPTION IN (D:/Projects/delme3.py, LINE 15 "print 1/0"): integer division or modulo by zero 
0

Najprostszym sposobem jest po prostu użyć:

import traceback 
try: 
    <blah> 
except IndexError: 
    traceback.print_exc() 

lub w przypadku korzystania z rejestrowania:

import logging 
try: 
    <blah> 
except IndexError as e: 
    logging.exception(e)