まつもと ゆきひろです

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. バックトレースを減らす

の両方ができているようにみえるんですけど.

                                まつもと ゆきひろ /:|)