From: nobu.nakada@... Date: 2000-03-12T12:20:37+09:00 Subject: [ruby-list:21342] Re: raise non-Exception object なかだです。 At Sat, 11 Mar 2000 12:45:26 +0900, Kenichi Komiya wrote: > > > StringでもExceptionでないものをraiseしようとすると、実際に投げられるもの > > > は、そのオブジェクトのexceptionメソッドの返り値になる。その返り値が > > > ExceptionでなければTypeError(ただし返り値がnilの場合はRuntimeError)。 > > > exceptionの呼びだしで例外が発生すればその例外がそのまま投げられる。 > > > > > > これをどこまでドキュメントに反映させるべきかって話もあるとは思いますが、 > > > 「何をraiseされようがrescue Exceptionで待っていれば補足はできる(でも情報 > > > は欠落するカモ)」ということがわかるといいかなと思います。 > > > > > > Ruby本の105ページに「新しく例外を定義するときはException(またはそのサブ > > > クラス)から継承したクラスを定義します。」とある事ですし、いっそそれ以外 > > > のものをraiseしようとしたら単純にArgumentErrorかTyepErrorでいいんじゃな > > > いかと思うのですが。いかがでしょうか? > > > > これは解釈の問題かも知れませんが、ArgumentError や TyepError は > > 本来の exception の前に raise の入口ではねられて発生しているもの > > だと思います。だから当然意図した exception の情報は持っていない、 > > というか raise の入口で発生した例外のために実際に起こそうとした例 > > 外は捨てられてしまっているということじゃないでしょうか。 > > > > え〜と、私が書いた「ArgumentErrorやTypeErrorうんぬん」というのは現状の振 > 舞いをそういう風にドキュメントしようという提案ではなく、別にそう仕様だっ > たとしてもかまわないんじゃないかなぁ、という程度のつもりでした。 > > で、仮にそうなっていた場合もなかださんのおっしゃるようにraiseの入口で本 > 来投げようとしていたオブジェクトは捨てられてしまうわけですが、その時に > 「TypeError:例外じゃないのでダメです!!」とraiseに怒られる方が、現状の > 「身に覚えのないNameError」より納得しやすいかなと思ったわけです。 たしかに「なんでNameError?」というのは分かる気がします。一言で 言っちゃうとその辺の振舞が分かりにくい or ちゃんと書いてない、と いうことですか? > |raise > |raise messageまたはexception > |raise error_type, message > |raise error_type, message, traceback > | > |例外を発生させます.第一の形式では直前の例外を再発生させます. 第二の形 > |式では,引数が文字列であった場合,その文字列をメッセー ジとする > |RuntimeError 例外を発生させます.引数 が例外であった場合にはその例外を発 > |生させます.第三の形式では 第一引数で指定された例外を,第二引数をメッセー > |ジとして発生さ せます.第四の形式の第三引数は $@または callerで得られる > |スタック情報で,例外が発生した場所を示します. たしかに引数が例外クラス/オブジェクトじゃない場合が書いてない ですね。 > 例外として発生させようとするオブジェクトがExceptionまたはそのサブクラ > スのインスタンスではない場合、そのオブジェクトのexceptionメソッドが返す > 値が実際に発生する例外になります。この値はExceptionまたはそのサブクラ > スのインスタンスでなければなりません。 > > ・・・というのを追加するという案です。 いいんじゃないでしょうか。賛成です。正確には Exception であって も exception() は呼ばれるようですが、Exception#exception は自分自 身を返すし、Exception.exception は自分のインスタンスを返すので > > ただ、もともとここでの記述って「例外」という言葉をExceptionまたはそのサ > ブクラス(あるいはそのインスタンス)という意味にも使ってますよね。そうする > と上の文章は自分でもむちゃくちゃ冗長に感じられます(ダメじゃん)。 こうですか? > 引数が例外ではない場合、そのオブジェクトのexceptionメソッドが > 返す値が実際に発生する例外になります。この値は例外でなければな > りません。 # なんか日本語としてヘンかも(^^;。 -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦