- - PR -
try-catchもうひとつの使い方
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-15 18:31
try-catchもうひとつの使い方
http://gocheong.riric.jp/Operate/try-catch.html [ メッセージ編集済み 編集者: gocheong 編集日時 2005-05-15 19:31 ] | ||||||||||||||||||||||||
|
投稿日時: 2005-05-15 20:19
「意識的にキャッチしないとフローを先に進めることができない」ということを意図したんだろうけど、うまく機能しないと思います。x()→y()→z() の順番でメソッドを呼びたいのなら、プログラマは次のように書くことができます。
なので、必然的に厳密なプログラムを書くことを強制できているとは言えません。
「処理α1」を必ず実行したいのなら、finally を使えば済む話だと思います。
正常系処理フローが長くなればなるほど、ネストが深くなっていくんですよ? コードの保守性が高いとはお世辞にも言えないと思いますが。括弧のズレなどでバグが発生するだろうことは十分に予想されます。
「return」は文字通り「戻す・返す」ですから、プログラマの心理上、返すからには正確に返さなければと責任感を持たせることができるでしょう。(ほんとかな?)
パフォーマンス劣化など大した欠点ではないと思います。この試みの欠点は、「コードが煩雑になり保守性が低下すること」「正常系に例外を使用するという通常プログラマが考えない方法を用いていること(発想の共有が難しくなる)」だと思います。それに、正常系に例外を使うことを強制したとしても、結局、プログラマは return の代わりに throw を書くだけで何も変わらないのではないかと思います。 「投げる」と言えば「(無責任に)サジを投げる」って考える人もいるし。というか例外って自分で責任もって処理できない問題に直面したときに投げるものだと思うので、「サジを投げる」というのは、結構、的を射ているかもしれないな。 | ||||||||||||||||||||||||
|
投稿日時: 2005-05-15 20:42
例えば、
public void hoge() throws Exception で定義されているメソッドであれば、 キャッチ忘れが直接バグの原因になりますね。 キャッチしなくてもコンパイルは可能になります。 未記入さんが仰るように、 例外を簡単に握りつぶすことも可能ですね。 実装方法も強制化されているようでは再利用性にも疑問が生じます。 #私は、そんなコードが出てきたら即突き返します。。。 | ||||||||||||||||||||||||
|
投稿日時: 2005-05-15 21:09
この方法のもう一つの問題は、例外を適切な呼び出し階層
で処理させることが難しくなることです。 初心者がよくやる誤りに、throwsで上位に伝播させるべき 例外を無闇に catchしてしまうことがありますが、 提案はこのような誤りを助長することになるでしょう。 新しい発明が gocheongさんのような逆転の発想から生まれ ることも多いと思いますが、本件は残念ながら…。 | ||||||||||||||||||||||||
|
投稿日時: 2005-05-16 00:35
今手元にないのであやふやですが、たしかEffectiveJavaにも例外処理機構を例外処理以外の
制御フローに使うのはやってはいけないことと書いてありましたね。 | ||||||||||||||||||||||||
|
投稿日時: 2005-05-16 00:53
私の場合、メソッドの宣言=仕様と認識しています。
入力・出力・異常系が宣言によって示されます。 戻り値を返したい場合、どうするのでしょうか?
* 使い方 * ライブラリ側 throw new HogeException(list); 実装側
合理性に欠けますよね。 | ||||||||||||||||||||||||
|
投稿日時: 2005-05-16 00:53
Javaの格言の”例外の不適切な使い方”というのを思いだしました。
| ||||||||||||||||||||||||
|
投稿日時: 2005-05-16 00:56
パフォーマンス結果で30倍遅くなったと出てますが、すべての制御フローをtry catchでおこなったら全体的にはかなりパフォーマンス劣化になりそうですね。
採用するメリットはなさそうです。 |