けいじゅ@SHLジャパンです. In [ruby-list :00422 ] the message: "[ruby-list:422] exception spec ", on Aug/21 13:06(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >で,いろいろ考えた結果,rubyの例外の仕様を以下のようにするこ >とにしました.御意見をお待ちします. ># 石塚さんには満足して頂けると思います. 大幅に変わりましたねえ(^^;;; >(1) 変数 $! の値は文字列から例外オブジェクトに変更した > exitとinterruptも統合したので,正確に言うと「例外」では > なく,「大域脱出」です. exitも捕捉しちゃうんですか? どういう時に役に立つのだろう? > で,工夫した点は「大域脱出オブジェクト」が文字列のサブク > ラスである点です.文字列として扱う場合には今までと全く同 > じに使えます. 今までとの互換性を考えたわけですね. > クラス階層を見るとSystemCallErrorの下にErrno::ENOENTとい > うような例外がありますが,これはlinuxのerrno.hを元に生成 > しました.linux以外のOSでは定義されないものや逆に名前が > 与えられないものがある可能性は否定できませんが,ほとんど > の場合はカバーされるはずです. これってどういう意味ですか? Errno::ENOENT というクラス? それとも, SystemCallError のインスタンス? Errnoモジュールのクラス変数? クラスでありそのクラスがErrno::ENOENTに代入されているのかな? >(2) resuceの構文の変更 > いままでrescueは全ての例外を捕捉していましたが,構文を変 > 更して捕捉する例外を指定できるようにしました.指定を省略 > すると今まで通り全ての例外を捕捉します(がexitとinterrupt > は捕捉しない).また一つのbegin文に複数のrescue節を指定で > きるようにしました. > > 例: > > begin > ... > rescue SyntaxError, IndexError > ... > rescue Interrupt > ... > end クラスで識別するわけですね. > また例外以外の大域脱出(exitとinterrupt)もrescueで捕捉で > きるようになりました. 前にもいったかも知れないのですが, interruptがどのsignalか区別できると 嬉しいのです. 例えば, interruptの種別毎にサブクラスがあるとかですね. >(3) raise > rubyの中から例外も発生するメソッドはfailからraiseに変わ > りました.APIは > > raise # 最後の例外の再発生 > raise 文字列 # RuntimeErrorを起こす これって, この使い方はできないという意味ですよね? > raise 例外 # 「例外」を起こす > raise 例外クラス, 文字列 # 指定したクラスの例外を起こす raiseするには, 例外を指定するか, 例外クラス+文字列で起こすわけですね. > ただし,failはraiseの別名として今でも使えます.以前のプ > ログラムはみな正常に動くはずです.fail!は無くなりました. > raise!はまだありません.しばらく使ってみてやはり必要なよ > うなら追加します. fail!の存在を知らなかったのですがどういう意味だったのでしょう? >(4) C I/F > * 例外の定義 > 既に説明したように,例外はクラスですから,新しい例外を > 定義すると言うことは新しいクラスを定義することです.た > いていはGlobalExitかExceptionのサブクラスとして定義し > ます.rubyの処理系ではCから eXXXX という識別子で参照で > きるようなルールを使っています. > > 例: > > extern VALUE eException; > eKeyError = rb_define_class("KeyError", eException); rubyレベルで例外クラス及び例外を定義するにはどうしたら良いのかな? __ ..........................................石塚 圭樹@SHLジャパン(株)... ------------->アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----