2013-08-22 102 views
1

如何確保在不包含整個回溯的情況下打印出失敗的實際行?對我來說,追溯可能太長,也打印一切。Python回溯,顯示出現錯誤的行,即使未顯示完整回溯

此代碼只打印函數a和b中的錯誤,但我想看到實際的錯誤發生在函數d中。

import traceback 
def a(): 
    try: 
     return b(); 
    except: 
     print traceback.format_exc(2) 

def b(): 
    return c(); 

def c(): 
    return d(); 

def d(): 
    x = 1/0 

a() 

回答

2

你可以做這樣的事情:

import sys 
import traceback 

def a(): 
    try: 
     return b(); 
    except: 
     _, _, tb = sys.exc_info() 
     print traceback.format_list(traceback.extract_tb(tb)[-1:])[-1] 

或者自己格式化字符串,只要你喜歡:

import sys 
import traceback 

def a(): 
    try: 
     return b(); 
    except: 
     _, _, tb = sys.exc_info() 
     filename, lineno, funname, line = traceback.extract_tb(tb)[-1] 
     print '{}:{}, in {}\n {}'.format(filename, lineno, funname, line) 

此函數返回三個值的元組,提供有關當前正在處理的異常的信息(...) 如果堆棧中的任何位置沒有異常處理,則返回包含三個None值的元組。否則,返回的值是(type,value,traceback)。

返回高達限制從回溯對象追蹤提取的「預處理」堆棧跟蹤條目的列表。這對堆棧跟蹤的替代格式非常有用。如果限制被忽略或無,所有條目被提取。 「預處理」堆棧跟蹤條目是一個四位(文件名,行號,函數名稱,文本),表示通常爲堆棧跟蹤打印的信息。該文本是一個帶有前導和尾隨空白字符的字符串;如果源不可用,則爲無。

定爲由extract_tb()或extract_stack(返回一個元組列表),返回字符串準備打印的清單。結果列表中的每個字符串對應於參數列表中具有相同索引的項目。每個字符串以換行符結束;對於源文本行不是None的項目,字符串也可以包含內部換行符。

+0

嘗試了第一個例子,結果很好。 – user984003