- - PR -
try-catchもうひとつの使い方
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-16 01:16
下位モジュールの処理完了を、一種の「割り込み」のような形で上位モジュールに通知する方法かな、という印象を直観的に受けました(「メッセージ」とはちょっと違うような・・)。
catchの中身が割り込みハンドラって感じですか。 勿論、下位モジュールが終了するまで上位モジュールは何もできないので、 効果は薄そうですが・・ いいか悪いかは別として、 発想は面白いと思います。 ただ、テストに関する考察がちょっとな。 普通でやって2秒で出来る処理が、この方法では1分以上かかってしまっては大問題では・・? 実際コアとなる部分に実装すると、到底無視できない時間になると思うけど・・ >mogeさんと被った・・同意見で良かったです。 [ メッセージ編集済み 編集者: らぶま 編集日時 2005-05-16 01:18 ] | ||||||||
|
投稿日時: 2005-05-16 02:09
まあ、マトモに考えれば「やっちゃいけない事例」の上位に出てきそうなアイデアですね。
でも、これ以外に実装手段がないような例もあります。 以前、スクリプト言語のインタープリタをJavaで実装していた時に、 (1) ループの途中での break (2) 関数の途中からの return を実装するのに、Exceptionを使いました。 stacktrace情報を持たない「軽いThorwable」というか、 純粋な「setjmp-longjmp」メカニズムが欲しいと痛感しました。 | ||||||||
|
投稿日時: 2005-05-16 13:05
色々考えてみても利点<欠点ではないでしょうか?
やっちゃいけない事としてよくのってますしね またcoasmさんの
といった事も (1) ループにラベルを設定する。 (2) 関数の途中にreturn文書いてしまえばその時点で returnされちゃうと思うのですが、、 なのでExceptionを使わず実装できるのではないでしょうか | ||||||||
|
投稿日時: 2005-05-16 20:40
発想は面白いと思いますが、元Cプログラマとしてはifでキャッチすべきかと。
ループ内の強制throwはコストかかりすぎです。 | ||||||||
|
投稿日時: 2005-05-16 21:11
これは実装したスクリプト言語の話では? | ||||||||
|
投稿日時: 2005-05-17 12:38
そうです。スクリプト言語のbreakやreturnを実装する場合の話です。
構文ツリーを解釈実行する際の処理で、たとえば関数途中からの returnだと、 javaのメソッド 呼び出しはこんな感じでネストします。 (1) 「関数呼び出し」の処理 (2) 「関数本体」の処理 (3) 「if文」の処理 (4) 「thenブロック」の処理 (5) 「return文」の処理 ここで、(5)から(1)に大域脱出する必要が生じるのですが、 例外のcatch/throw機構を使うのが一番シンプルな実装でしょう。 |