ruby 如何处理异常

sczxawaw  于 11个月前  发布在  Ruby
关注(0)|答案(3)|浏览(82)

根据ruby-docapidock,您可以使用to_jsonjson_create序列化和非序列化异常。
但是在浪费了一些时间试图使用它们之后,我仍然没有找到一种方法。
调用exc.to_json得到一个空的哈希,而Exception.json_create(hash)得到这个错误:undefined method 'json_create' for Exception:Class
我想我可以很容易地重新创建这些功能,因为源代码是可用的,但我宁愿了解我做错了什么......任何想法?

wfveoks0

wfveoks01#

JSON模块默认情况下不扩展Exception。你必须使用require "json/add/exception"。这在Ruby JSON模块文档的JSON Additions部分有说明。

require "json/add/exception"
 
begin
  nil.foo
rescue => exception
  ex = exception
end

json = ex.to_json
puts 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扩展。
要反转该过程,可以将create_additions: true选项传递给JSON.parse

p JSON.parse(json, create_additions: true)
# => #<NoMethodError: undefined method `foo' for nil:NilClass
#
#      nil.foo
#         ^^^^>

s5a0g9ez

s5a0g9ez2#

Jordan的回答是正确的。如果你有一个案例,例如,你需要序列化一个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:)

r6vfmomb

r6vfmomb3#

同样重要的是要注意,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

相关问题