2017-07-21 34 views
0

,我得到這樣如何當我嘗試使用<code>json.dump</code>序列化異常序列化異常

TypeError: IOError('socket error', error(61, 'Connection refused')) is not JSON serializable 

TypeError: error(61, 'Connection refused') is not JSON serializable 

例外的__dict__領域的錯誤是{}(這就是爲什麼How to make a class JSON serializable做沒有幫助我:那裏的答案假設__dict__包含所有必要的信息,他們還假定我有控制要被序列化的類)。

有沒有更省電的東西str(exn)

我寧願一個人類可讀的文本表示(不是pickle)。

PS。以下是我想出了:

def exception_as_dict(ex): 
    return dict(type=ex.__class__.__name__, 
       errno=ex.errno, message=ex.message, 
       strerror=exception_as_dict(ex.strerror) 
       if isinstance(ex.strerror,Exception) else ex.strerror) 

json.dumps(exception_as_dict(err),indent=2) 
{ 
    "errno": "socket error", 
    "type": "IOError", 
    "strerror": { 
    "errno": 61, 
    "type": "error", 
    "strerror": "Connection refused" 
    } 
} 
+0

你可以捕獲異常對象,並醃製它?您可以將pickled數據作爲二進制負載傳遞給JSON對象。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ:我寧願一個人類可讀的文本表示。您的評論表明答案是「否」。謝謝。 – sds

+0

你沒有說清楚。看起來你想要一種遠程交流可執行文件的方式。無論如何,您將不得不尋找一些第三方庫,或編寫自己的自定義分析器來解構或構建JSON的對象。 –

回答

0

異常不能醃製(默認),你有兩個選擇:

  1. 使用Python的內置format_exc()和序列化格式的字符串。

  2. 使用tblib

對於後者,你可以通過包裝異常,後來又再加註他們。

import tblib.pickling_support 
tblib.pickling_support.install() 
import pickle, sys 

def inner_0(): 
    raise Exception('fail') 

def inner_1(): 
    inner_0() 

def inner_2(): 
    inner_1() 

try: 
    inner_2() 
except: 
    s1 = pickle.dumps(sys.exc_info()) 
+0

不好 - 我不想泡菜,它不是人類可讀的。 – sds