例外をシリアル化する方法
概要
Ruby-doc と apidock によると、to_json と json_create を使用して例外をシリアル化および逆シリアル化できます。
しかし、それらを使おうとして時間を無駄にした後、まだ方法が見つかりません。
exc.to_json を呼び出すと空のハッシュが得られ、Exception.json_create(hash) を呼び出すと次のエラーが表示されます: Exception:Class のメソッド ‘json_create’ が未定義です
ソースが入手可能なので、これらの関数を簡単に再作成できると思いますが、むしろ自分が間違っていることを理解したいのですが…何かアイデアはありますか?
解決策
JSON モジュールはデフォルトでは Exception を拡張しません。 「json/add/Exception」を必須にする必要があります。これについては、Ruby JSON モジュールのドキュメントの「JSON の追加」セクションに記載されています。
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>'"]}
Ruby ソースの ext/json/lib/json/add をチェックして、どのクラスがこのように動作するかを確認してください。 「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
# ^^^^>