- ベストアンサー
例外の再スロー時に、その原因となった例外はどう渡す?
今まではJavaを主に使っていたのですが、最近Rubyを使い始めた者です。 rescue節で例外を捕捉し、例外が発生した状況などの補足情報を新しい例外オブジェクトに付加して、より抽象度の高い例外として再スローしたいと思っています。 しかし困ったことに、Rubyの例外クラスでは、JavaのExceptionクラスのようにcauseを引数に渡して例外オブジェクトを生成することはできないようです。 Rubyではこのような場合、どのような方法で例外の情報を新しい例外オブジェクトに引き継ぐのが一般的なのでしょうか? よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
よくわかりませんが、こういう事ではないとしたら、もうちょっと具体的によろしく。 begin begin a=1/0 rescue => e raise(StandardError,e.message+'!!',e.backtrace) end rescue => e p e p e.message p e.backtrace end
その他の回答 (2)
- danslarue
- ベストアンサー率30% (4/13)
組み込みライブラリにないのであえてやろうとすれば自前で用意するしかないです。私自身はより抽象度の高い例外に元の例外情報を付けたいと思ったことはないです。例外ハンドラ内で解釈して抽象度の高い例外を作成しますので。
お礼
どうもありがとうございます。 > 例外ハンドラ内で解釈して抽象度の高い例外を作成しますので。 その場合、デバッグ時に例外が発生した箇所を特定できなくて困ると思うのですが・・・。
- siffon9
- ベストアンサー率64% (136/211)
JAVAの知識が無く、ご質問をよく理解できていないので外しているかもしれませんが、最近発生した例外の情報は変数$!や$@で取得できます。 これを自分で定義したクラスに渡してあげれば良いのではないでしょうか。 class MyError < Exception attr_reader :my_messages def initialize(mes, *my_mes) super(mes) @my_messages = my_mes end end i = catch(:exit) do begin raise "hoge" rescue RuntimeError err = MyError.new($!,$@,"foo") throw :exit, err end end p i p i.message p i.my_messages
補足
回答どうもありがとうございます。 確かに自分でクラスを定義すれば可能なのは分かっているのですが、 私がお聞きしたかったことはそういうことではなくて、 「Rubyの文化や思想に倣って考えたときにどうするべきであるのか?」 ということでした。 仮に、siffon9さんの提案された方法がRubyで例外を扱う際にベストな方法だとしたら、当然RubyのExceptionクラスはそのような設計になっているはずですよね? しかし、Rubyは十分に成熟した言語であるにもかかわらず、そのような設計にはなっていません。 Ruby開発者が毎度毎度そのような例外のライブラリを別途導入して開発している(もしくは新たに例外クラスを定義している)とも考えにくいので、そこには何か文化的な理由があるのではないかと思うのです。 主にその辺のことについてお聞きしたいと思っておりました。 ですから、回答が「Rubyでは普通そんな設計はしない」というものでも結構だったのですが・・・。 質問が分かりにくく、申し訳ございませんでした。 もう一度答えていただけるとうれしいです。
お礼
その通りです。 あまり一般的ではないようですが、Rubyでも書けることは書けるのですね。 どうもありがとうございました。