2015-06-09 63 views
5

不錯的字符串我想要生成從Exception一個行字符串,它告訴我什麼發生其中(並不需要一個完整的回溯)。下面的信息將是不錯:適當的方式來獲得異常

  • 文件名/行號
  • 異常類型
  • 異常描述(你str(e)得到什麼)
  • 很高興有:函數/方法/類

目前我做了以下工作:

import os 
... 
try: 
    os.nonexisting() 
except Exception as e: 
    t = e.__traceback__ 
    tbf = e.__traceback__.tb_frame 
    print('%s:%d: %s in %s(): "%s" ' % 
     os.path.basename(tbf.f_code.co_filename), 
     t.tb_lineno, 
     e.__class__.__name__, 
     tbf.f_code.co_name, e)) 

這給了我:

foo.py:203: AttributeError in foo(): "'module' object has no attribute 'nonexisting'" 

有沒有打印出在這個例子中給出的細節更優雅的方式?我正在考慮s.th.像

print(e.format('%f: %l: %t %F: "%w"')) 

我想避免導入額外的模塊,除了有一個完全爲此目的。

回答

4

我認爲traceback.format_exception_only確實是你想要的。

try: 
    os.nonexisting() 
except Exception as e: 
    print(traceback.format_exception_only(e.__class__, e)) 
+0

它產生'[ 「AttributeError的: '模塊' 對象沒有屬性 '不存在的' \ n」 個]'不是OP想要的(其中,是文件名,行號,功能/方法的名字嗎?)。 – jfs

+0

事實上,問題是將文件/行號信息添加到'format_exception()'而沒有弄亂'sys.exc_info()','extract_tb'等內部。 – frans