Techioz Blog

例外をシリアル化する方法

概要

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
#         ^^^^>