けいじゅ@今はフリー(^^;;;です. 

In [ruby-list :03195 ] the message: "[ruby-list:3195] Re: Matrix ", on
Jun/30 14:55(+0200) matz / caelum.co.jp (Yukihiro Matsumoto) writes:

>|e2mmap.rbはなんかすさまじいですね。
>|# バックトレースにfailが入ってきちゃうのがちょっと残念ですが、
>|# さすがにrubyからバックトレースを操作するのは無理かな。
>
>バックトレースっていっても$@に入っている文字列の配列ですから,
>rubyの機能だけでちょいちょいと操作できます.石塚さんは操作す
>るっていってたのでfailが入っちゃうのはミスではないかと.

なんですが... 色々と問題があって, 聞こうと思っていたのですが忘れていま
した(^^;;;

で, 問題というのは, $@ にバックトレースが設定されるのは, failが呼ばれ
てからですよね? (または, callerを呼ぶ?)

e2mmap.rbの当該部分を以下のように変えます.

  def fail(err, *rest)
#    $@ = caller(1)
    begin
      super(err, sprintf(E2MM_ErrorMSG[err], *rest))
    rescue
      $@.pop
      print $@.pop, ': ', $!, '\n'
      for m in $@
	print '\t', m, '\n'
      end
#      fail!
    end
  end

そうすると, メッセージは正しく出るのですが, このままでは, メッセージを
出して, failメソッドを終了し処理を継続してしまいます. とはいえ, exitす
ると今度はこの例外をキャッチすることができません. もう一度, super(...)
とすると, そちらでのメッセージが出てしまいます...

やりたいこと:
  1. 通常の例外と同じ動作を行う
     1.1 例外のキャッチができる
     1.2 例外が捕捉されなかった時のみメッセージを表示する.
  2. 最上段のバックトレースを1つけす.

一体どうしたら良いでしょう?

__
.........................................石塚 圭樹@今はフリー(^^;;...
------->>また, アドレス変わりました!! e-mail: keiju / bc.mbn.or.jp <<---