【发布时间】:2017-12-27 16:13:28
【问题描述】:
当我尝试使用 json.dump 序列化异常时,我收到类似的错误
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"
}
}
【问题讨论】:
-
您可以捕获异常对象并腌制它吗?您可以将腌制数据作为 JSON 对象中的二进制有效负载传递。
-
@cᴏʟᴅsᴘᴇᴇᴅ:我更喜欢人类可读的文本表示。您的评论表明答案是否定的。谢谢。
-
你没有说清楚。似乎您想要某种远程通信异常的方式。无论如何,您必须寻找一些第 3 方库,或者编写您自己的自定义解析器来解构或构造与 JSON 之间的对象。
-
@Leon: 不是真正的骗子:
__dict__在Exception中毫无用处。
标签: python json python-2.7 exception serialization