From: SASADA Koichi Date: 2010-03-10T11:53:32+09:00 Subject: [ruby-dev:40592] Re: Fast Exception creation with raw backtrace  ささだです. (2010/03/10 10:11), Tomoyuki Chikanaga wrote:: > ただ dRuby 経由のメソッド呼び出しで例外を返す時に、Exception が > Masrhal できないと DRbRemoteError に変換されてしまうので、困る > ことがありそうです。  Marshal は出来るようにしようと思っております. > set_backtrace で「読みやすいバックトレース」がセットされたら > Marshal 可能になるとか、『「読みやすいバックトレース」を生成するのに > 必要な情報』の部分がオブジェクトになってて、そこだけ DRbObject で > 参照渡しできるなど回避方法があればいいと思います。  両方のアプローチとしようと思います.  つまり,set_backtrace(Array) で設定も出来るし,何もしなくても,今まで 通りに Marshal 可能にしようと思います. > 多分こっちですよね。 > http://www.atdot.net/~ko1/diary/201003.html#d10  そうです.大変間抜けなことをしてしまいました.失礼しました. >>  デフォルトでは問題無いと思うのですが,Exception#set_backtrace が再定義 >> されていると問題になるかもしれません.が,そういう用途があるかはよくわか >> りません. > 再定義されている例には心当たりありませんが、例外のクラスを > 途中で切り替えつつバックトレースは元の例外のものにするということを > 以下のようにしていることがあります。 > > begin > ... > rescue HogeError > raise FooError, "msg: #{$!.message}", $@ > # または > err = FooError.new("msg: #{$!.message}") > err.set_backtrace($@) > raise err > end > > こうするとこの時に一旦「読みやすいバックトレース」が生成されて > それをセットすることになると思いますので、「元の必要な情報」だけを > 引き継ぐ方法があれば無駄がなくていいなー、とは思います。 > ただ違う書き方をしないといけなくなると思うので、その恩恵に > あずかるにはスクリプトを書き替えないといけませんけど。  まぁ,特殊ケースだと思いますので,恩恵にあずかれないけどきちんと動く よ,というようにしようと思います. -- // SASADA Koichi at atdot dot net