プロが教えるわが家の防犯対策術!

今まではJavaを主に使っていたのですが、最近Rubyを使い始めた者です。

rescue節で例外を捕捉し、例外が発生した状況などの補足情報を新しい例外オブジェクトに付加して、より抽象度の高い例外として再スローしたいと思っています。

しかし困ったことに、Rubyの例外クラスでは、JavaのExceptionクラスのようにcauseを引数に渡して例外オブジェクトを生成することはできないようです。

Rubyではこのような場合、どのような方法で例外の情報を新しい例外オブジェクトに引き継ぐのが一般的なのでしょうか?

よろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

その通りです。
あまり一般的ではないようですが、Rubyでも書けることは書けるのですね。
どうもありがとうございました。

お礼日時:2008/11/20 08:46

 組み込みライブラリにないのであえてやろうとすれば自前で用意するしかないです。

私自身はより抽象度の高い例外に元の例外情報を付けたいと思ったことはないです。例外ハンドラ内で解釈して抽象度の高い例外を作成しますので。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

> 例外ハンドラ内で解釈して抽象度の高い例外を作成しますので。
その場合、デバッグ時に例外が発生した箇所を特定できなくて困ると思うのですが・・・。

お礼日時:2008/11/20 08:42

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では普通そんな設計はしない」というものでも結構だったのですが・・・。

質問が分かりにくく、申し訳ございませんでした。
もう一度答えていただけるとうれしいです。

補足日時:2008/10/25 11:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!