From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-04-14T09:26:13+09:00 Subject: [ruby-dev:2292] Re: [Req] stack level too deep (fatal) けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :2281 ] the message: "[ruby-dev:2281] Re: [Req] stack level too deep (fatal) ", on Apr/13 16:39(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|うーん. この例外ってプログラムに由来するものなので, 普通は受けとっても >|どうしようもない例外ですよね... SyntaxErrorも同じですが, これらは明示 >|的に指定しないと受けとれない例外になっていた方がよかないですか? つまり, >|GlobalExitの直下に置くということですが. > >そうですかねえ.ArgumentErrorもそうですが,プログラム由来の >例外だからってそんなに特別扱いする必要があるものでしょうか. >ごっちゃになって困るのは他のランタイム例外でも同じですし. rubyって例外を明示的に示す必要ないですよね. その時って, 明示的に指定していなくとも, 暗に何の例外が発生するか仮定し ているんだともいます. begin f = File.open(file, "r") rescue ... ファイルがない場合の処理 end この時に, そもそもプログラム由来の NameError: undefined local variable or method `file' for # なんて例外をキャッチしても正しい処理を行なっていることにはならないです よね. つまり, 引数なしのrescueをより思っている例外を捕捉するためにには, 区別 した方が良いかなと思うんですが. # 実際わけ分からん例外のためにデバッグが大変な時って結構あるし... 他のランタイム例外も同時に起こる可能性があるなら, 区別しなくちゃいけな いんでしょうけど, プログラム由来の例外を省くと, 複数の例外が起こる可能 性は大部減ることになって, デフォルトrescueも使いやすくなるんじゃないか しら? >とはいえ,Javaでも分かれていたように思いますし,分けてはいけ >ないとまで考えているわけではないです.きちんとした議論を行っ >て「どのような例外はデフォルトで捕捉すべきでないか」というこ >とについて明らかな基準が設定できれば,変更するのはやぶさかで >はないです. > ># でも,一緒になってる方がruby風って印象はあります. きっと, ちゃんと分けることによってruby風のプログラミング(=引数なし rescue)ができるようになるんじゃないかしら? で, 何で区別するかですが, 何がいつ発生するか知らないと区別できないんで すけど... 1. コードの書き方に由来する例外で, 基本的に対処しようがないもの SyntaxError evalでの文法エラー LocalJumpError 不正なbreak/next/redo.. ArgumentError 引数の数が合わない NameError 定義されていない名前を参照 NotImpError このOSでは実装されていない TypeError 型が合わない 2. ユーザ側で予測し得る例外. RegxpError ZeroDivisionError IndexError インデックスが範囲外 LoadError ロードするファイルが無い SystemCallError システムコールエラーの親 IOError sytem call以外のIOエラー EOFError EOFに出会った 3. カテゴリ化された例外群 ThreadError SocketError ソケットのエラー SecurityError safe.rbで定義されてる RuntimeError とくに限定なし このうち2と3がデフォルトでキャッチする例外になると良いんじゃないかしら? 3も本来1,2のどちらかに振り分けられる細分化された例外になるんでしょうが ごっちゃになっていますので... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---