[#380] bug report#3 and request#5 — keiju@... (Keiju ISHITSUKA)
けいじゅ@SHLジャパンです.
1 message
1996/08/06
[ruby-list:425] Re: exception spec
From:
matz@... (Yukihiro Matsumoto)
Date:
1996-08-23 03:29:58 UTC
List:
ruby-list #425
まつもと ゆきひろです.
In message "[ruby-list:424] Re: exception spec"
on 96/08/22, 石塚圭樹 <keiju@shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです.
|># 石塚さんには満足して頂けると思います.
|
|大幅に変わりましたねえ(^^;;;
実はそれほど変わっていないんですよ,中身は.名古屋<->東京間
の新幹線の中でほとんどできちゃいましたから.
|> exitとinterruptも統合したので,正確に言うと「例外」では
|> なく,「大域脱出」です.
|
|exitも捕捉しちゃうんですか? どういう時に役に立つのだろう?
例えば
while line = gets
begin
eval line
rescue SystemExit
print "You can't exit\n"
end
end
などユーザ入力された文字列をevalしたいがexitはしたくない時な
どに使えると思います.
|> で,工夫した点は「大域脱出オブジェクト」が文字列のサブク
|> ラスである点です.文字列として扱う場合には今までと全く同
|> じに使えます.
|
|今までとの互換性を考えたわけですね.
そうですね.それに私は今の仕様も結構好きなんです.
|> クラス階層を見るとSystemCallErrorの下にErrno::ENOENTとい
|> うような例外がありますが,これはlinuxのerrno.hを元に生成
|> しました.linux以外のOSでは定義されないものや逆に名前が
|> 与えられないものがある可能性は否定できませんが,ほとんど
|> の場合はカバーされるはずです.
|
|これってどういう意味ですか?
|
| Errno::ENOENT というクラス?
|
|それとも, SystemCallError のインスタンス? Errnoモジュールのクラス変数?
Errno::ENOENTというクラスです.これはErrnoモジュールのクラス
変数ENOENTとしてアクセスされます.
|クラスでありそのクラスがErrno::ENOENTに代入されているのかな?
ですから,これが正解です.
|>(2) resuceの構文の変更
|クラスで識別するわけですね.
C++やJavaを連想できて良いのでは?
|> また例外以外の大域脱出(exitとinterrupt)もrescueで捕捉で
|> きるようになりました.
|
|前にもいったかも知れないのですが, interruptがどのsignalか区別できると
|嬉しいのです. 例えば, interruptの種別毎にサブクラスがあるとかですね.
interruptは一種類(SIGINT)しかないです.
|>(3) raise
|> rubyの中から例外も発生するメソッドはfailからraiseに変わ
|> りました.APIは
|> raise 文字列 # RuntimeErrorを起こす
|
|これって, この使い方はできないという意味ですよね?
できます.例外の種別が指定されず文字列しか与えられなかった場
合には,RuntimeErrorという例外が発生します.まあ,互換性のた
めなんで,これの使用はお勧めしませんけどね.
|raiseするには, 例外を指定するか, 例外クラス+文字列で起こすわけですね.
基本的にはそうですね.
|fail!の存在を知らなかったのですがどういう意味だったのでしょう?
単なる別名です.failは予約語ではないので,ユーザがもし同じ名
前のメソッドを定義しちゃった場合に例外が発生できなくなると困
るので.break,next,redo,retryにもそれぞれ `!'のついた別名が
定義されています.
|> * 例外の定義
|rubyレベルで例外クラス及び例外を定義するにはどうしたら良いのかな?
こういう感じです.
# 例外クラスの定義
class NewException<Exception
end
# 例外の発生
raise NewException, "the message you want to associate with'
イメージ掴めましたか?
まつもと ゆきひろ /:|)