質問: ### 例外について プログラミングは例外処理がついてまわるものだと思いますが、コンパイルエラーになること以外で、なぜ例外をキャッチ・あるいは投げなければならないかが不明です。 ### 疑問点 下のソースコードはDB接続の際の、凡庸な例外コードです。疑問が4つあります。 1例外が起こると強制終了になるが、**キャッチしても同じことでは**? (エラー画面にならないことがメリット?) 2の箇所に書く正しい処理はこれで正しいか?(エラー原因を突き止めるだけでいいのか。だとしたら、エラー処理が強制な理由がしっくりきません) 3この箇所にたどりつくまでにconがnullになる時はどんな時か 4よく本で**finally文で例外をキャッチしてもやることないため処理は不要です**と書いてありますが、僕にとっては他のキャッチ箇所もログを出すだけであれば、ここもprintstacktrace();を書けばいいのにと思ってしまいます。 ### ソースコード ``` //例外文のみ catch(SQLException e){ e.printstacktrace();・・・・・・2 }finally{ if (con != null){ ・・・・3 try{ con.close(); }catch(SQLException e2){ //処理は不要・・・・・・4 } } ```
回答: > > 1例外が起こると強制終了になるが、キャッチしても同じことでは? > > (エラー画面にならないことがメリット?) > > > 複数スレッドで動いている場合などは影響が該当スレッドだけでおさまります > > 2の箇所に書く正しい処理はこれで正しいか?(エラー原因を突き止めるだけでいいのか。だとしたら、エラー処理が強制な理由がしっくりきません) > > > 商用で使うプログラムなどでしたらエラー原因の解析は必須です (原因のわからないエラーは恐怖でしかありません ロジックの誤りなのかデータの異常なのか) あと、例外が発生した場合に後続処理をさせずにソフトランディングさせる意味でもcatchは必要です > > 3この箇所にたどりつくまでにconがnullになる時はどんな時か > > > 処理本文が乗っていないので何とも言えません conのNewに失敗したとかconをNewする前に例外が発生したとかでしょうか > > 4よく本でfinally文で例外をキャッチしてもやることないため処理は不要ですと書いてありますが、僕にとっては他のキャッチ箇所もログを出すだけであれば、ここもprintstacktrace();を書けばいいのにと思ってしまいます。 > > > この例のように処理がcloseだけならば原因はもっと前にあるからとかではないでしょうか? 別に書いても問題はないと思います。