如何序列化异常

时间:2016-05-27 17:57:51

标签: ruby

根据ruby-docapidock,您可以使用to_jsonjson_create序列化和反序列化例外。

但是在浪费了一些时间试图使用它们之后,我仍然没有找到方法。

致电exc.to_json会给我一个空哈希,Exception.json_create(hash)会给我这个错误:undefined method 'json_create' for Exception:Class

我想我可以很容易地重新创建这些功能,因为源代码可用,但我很了解我做错了什么......有什么想法吗?

3 个答案:

答案 0 :(得分:12)

默认情况下,JSON模块不会扩展Exception。你必须require "json/add/exception"。我不确定这是否记录在任何地方:

require "json/add/exception"

begin
  nil.foo
rescue => exception
  ex = exception
end

puts ex.to_json
# => {"json_class":"NoMethodError","m":"undefined method `foo' for nil:NilClass","b":["prog.rb:5:in `<main>'"]}

查看ext/json/lib/json/add in the Ruby source以查看哪种课程以这种方式运作。如果执行require "json/add/core",它将为Date,DateTime,Exception,OpenStruct,Range,Regexp,Struct,Symbol,Time等加载JSON扩展。

答案 1 :(得分:1)

约旦的答案是正确的。如果您有案件,例如。您需要序列化一个Exception并将其发送到要重构它的ActiveJob,然后需要使用.as_json方法。

require "json/add/exception"

begin
  nil.foo
rescue => exception
  ex = exception
end

puts ex.to_json.class
# => String

string = ex.to_json
puts Exception.json_create(string).message
# => m

puts ex.as_json.class
# => Hash

hash = ex.as_json
puts Exception.json_create(hash).message
# => undefined method `foo' for nil:NilClass

您需要阅读source code才能理解为什么Exception.json_create(string).message返回m的原因:)

答案 2 :(得分:0)

同样重要的是要注意,Exception.json_create示例未保留错误类。

Exception.json_create(JSON.parse(ArgumentError.new('error').to_json))
# => #<Exception: error>

请尝试:

require "json/add/exception"

def deserialize_exception(json)
  hash = JSON.parse(json)
  hash['json_class'].constantize.json_create(hash)
end