From: matz@... (Yukihiro Matsumoto) Date: 1997-07-01T18:45:34+09:00 Subject: [ruby-list:3222] Re: Matrix まつもと ゆきひろです In message "[ruby-list:3220] Re: Matrix" on 97/07/01, 石塚圭樹 writes: |けいじゅ@今はフリー(^^;;;です. |で, 問題というのは, $@ にバックトレースが設定されるのは, failが呼ばれ |てからですよね? (または, callerを呼ぶ?) そうです. |e2mmap.rbの当該部分を以下のように変えます. |そうすると, メッセージは正しく出るのですが, このままでは, メッセージを |出して, failメソッドを終了し処理を継続してしまいます. とはいえ, exitす |ると今度はこの例外をキャッチすることができません. もう一度, super(...) |とすると, そちらでのメッセージが出てしまいます... うーん, def fail(err, *rest) begin super(err, sprintf(E2MM_ErrorMSG[err], *rest)) rescue $@.shift # failを削るならshift super() end end ではいけないんですかね(superのうしろの()が大事).あるいは failを削るだけならもっと単純なのは def fail(err, *rest) $@ = caller(1) $! = err.new(sprintf(E2MM_ErrorMSG[err], *rest)) super() end ですかね. |やりたいこと: | 1. 通常の例外と同じ動作を行う | 1.1 例外のキャッチができる | 1.2 例外が捕捉されなかった時のみメッセージを表示する. | 2. 最上段のバックトレースを1つけす. | |一体どうしたら良いでしょう? 上のコードだと 1. 例外を(メッセージを書き換えた上で)発生させる 2. バックトレースを減らす の両方ができているようにみえるんですけど. まつもと ゆきひろ /:|)