From: matz@... (Yukihiro Matsumoto) Date: 1997-07-19T00:12:35+09:00 Subject: [ruby-list:3392] Re: Exception まつもと ゆきひろです In message "[ruby-list:3388] Re: Exception" on 97/07/18, 石塚圭樹 writes: |けいじゅ@今はフリー(^^;;;です. |>というような形が考えられて,昔のrubyは一番上,今は真中ですよ |>ね.石塚さんが「なっていませんよね」とおっしゃるのは,一番下, |>つまりある例外はメッセージも含めて一意であるような例外の形式 |>ですよね. | |そうです. Cのerrno程度は欲しいなと思いました. 確かにerrnoはメッセージとコードが一意に決まっていますよね. でもrubyでは結構むずかしいんです.というのもerrnoはカーネル という一枚岩のシステムのエラーコードですが,rubyの場合は例外 はユーザーコードも含めてあらゆるところで生成されるので,だれ かが不適切な例外の発生を行っていれば全体の詳細度が下がってし まいますよね. rubyのような言語で例外の情報が一意であることを期待しようと思 えば今とは全く違う例外システムを考える必要があると思います. |>まあ,そういうのも存在しえて,かつ使う方としてはそれなりに便 |>利だろうとは思うのですが, |> |> * それぞれ個別の例外を定義するのが面倒臭い | |これはいえるんですよねえ.... でも, 実際にはメッセージの種類はたくさん |あるんだから, それと手間は変わらないともいえるような... 名前を考えるのはエラーメッセージを考えるより大変なので.それ にrubyインタプリタの範囲内でなら一意な例外を発生させることは 可能ですけど,上記の理由で苦労の割には結局あんまり意味がない ようにも思うので. |> * 例外の数が増えて大変 | |これに関しては, 例外クラスに階層を持たせることができるんだから, 増えて |も問題なくできるとは思いますよ. 今の例外にもう1階層増やす感じでね. まあ,仕組みとしてはそうですね.結局コストに見合わないと感じ ているわけです. |> * 現在の例外システムはPythonなどでも実績がある | |同じ程度の粒度なんですか? です.実は例外名などもかなりもらってきています. |>などの理由から,基本的には今のままで良いんでないかなあと思い |>ます.もっとも,不適切な例外をあげている場所があるかも知れま |>せんけど(ArgErrorのはずのところにTypeErrorとか). | |これはいけませんね. ですね.もっともどんなエラーに対してなにを返すか統一的に決め ていないというのもあるのですが.個別の例外に関しては議論の余 地があると思います.ただし,そんなに間違いがあると思っている わけでもないのですが,絶対であると確信しているわけでもないく らいですね. |Cのerrnoでは, 何かやる毎(関数毎)に調べなくてはいけないのですが, rubyの |例外はブロック大きく括ってキャッチできるようになっていますよね. つまり |複数の例外を発生させる可能性箇所をまとめて一箇所で例外処理ができますよ |ね. ここが便利な点なのですが, 今の粒度だと, 複数の箇所で同じ例外を出す |可能性が高くなりますよね. そうすると, ブロックの括りを小さくしなくちゃ |いけなくなり, 極端な場合, 関数毎に例外処理を行わなくなる点が気になって |いるぐらいですけどね. そいつは例外処理のスタイルの問題ですね.私はほとんどの場合 rescueは例外を指定しないで使います.『このブロック内で失敗し たら』というスタイルですね.ですから,関数毎ってのはまさに極 端だと思います. |そうそう. 最後にリクエスト:: | |例外のタイプを知るのに $!.inspect ではだめで, $!.typeを調べなくてはな |りません, Exception#inspectでtypeも出力するように変えてもらえません? これは対応しましょう. まつもと ゆきひろ /:|)