2013-01-25 130 views
31

我正在使用python來評估一些測量數據。由於許多可能的結果,難以處理或可能的組合。評估期間有時會發生錯誤。這通常是一個索引錯誤,因爲我超出了測量數據的範圍。Python異常處理 - 行號

找出問題發生在代碼的哪個位置是非常困難的。如果我知道在哪一行發生錯誤,這將有很大的幫助。如果我使用以下代碼:

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

不幸的是,這隻告訴我,有和索引錯誤。我想知道有關異常的更多細節(代碼行,變量等)以查明發生了什麼。可能嗎?

謝謝。

+1

見http://stackoverflow.com/questions/3702675 /打印的全向掃描功能於蟒蛇,沒有休止-的程序! –

+0

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

+2

@JeCh答案看起來不錯。請接受一個。要接受它,請單擊答案旁邊的空白複選標記。 –

回答

16

要簡單地得到行號,您可以使用sys,如果您想要更多,請嘗試traceback模塊。

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

打印

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

解,印刷文件名,行號,行本身和異常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() 

輸出:

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

最簡單的方法是隻使用:

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

,或者使用記錄:

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