まつもと ゆきひろです
In message "[ruby-list:3220] Re: Matrix"
on 97/07/01, 石塚圭樹 <keiju / bc.mbn.or.jp> 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. バックトレースを減らす
の両方ができているようにみえるんですけど.
まつもと ゆきひろ /:|)