- PR -

JavaTIPS 「データベースに接続したら後始末は確実に」に関して

投稿者投稿内容
平田@IT
会議室デビュー日: 2006/11/21
投稿数: 10
投稿日時: 2006-12-27 14:30
@IT編集部の記事編集を担当しております平田と申します。
いつも@ITをご覧頂き、誠にありがとうございます。

ご指摘頂いた点ですが、再々度新しいソースコードの
画像を作成し、差し替え、追記もさせていただきました。

大変お手数ではございますが、再々度訂正した記事をご確認頂ければ幸いです。

http://www.atmarkit.co.jp/fjava/javatips/166java051.html

今後とも@ITをどうぞよろしくお願いいたします。
guccii
会議室デビュー日: 2007/01/04
投稿数: 7
投稿日時: 2007-01-04 06:45
話を「例外処理」に戻してもいいですか?

引用:

mioさんの書き込み (2006-12-25 21:26) より:
んー…。
コード:
} finally {
    if (stmt != null) try { stmt.close(); } catch (SQLException e) {}
    if (conn != null) try { conn.close(); } catch (SQLException e) {}
}


かなー。



んー…。かなー。という気持ちよく分かります。たぶんこうなんだけど、なんとなくすっきりとはしない。
例外って、実際使ってみると以外と使いにくいですよね。try-catchの分ネストが増えちゃうし、ステップ実行してると突然飛ばされるので、エラーが起きた場所が分かりずらいし。全部のステップを個別にtry-catchで囲むの?javaは一応throwsもあるし、stackTraceがあるし、stackTraceも文字列としても取得できるようになったので、ログにも残せるのでまだいいですけど、C++の場合には無残ですよね。gotoを使ってはいけませんといいながらまんまsetjumpだし...。
例外処理中の例外の場合には、できるだけの後処理は一通り行っておきたいのに、例外で飛ばされちゃうから、さらに全部個別でtry-catchせざるをえない。
本当に例外的な事象についてはいいとしても、回復可能なエラーの場合には、例外機構よりも昔のように

コード:

  rc = conn->doSomething(); 
  if ( NO_ERROR != rc ) {
    // ログ出力
    goto ERROR_EXIT;
  }

  rc = conn->close();
  if ( NO_ERROR != rc ) {
    // ログ出力
    goto ERROR_EXIT;
  }
      
  return ( NO_ERROR );

ERROR_EXIT:

  {
  int rc;
  if ( NULL != conn ) {
      rc = conn->close();
      if ( NO_ERROR != rc ) {
          // ログ出力
      }      
  }
  }

  return ( rc );



で十分だったような気がします。

ん!?でもいっしょかぁ。
finallyの分重複が避けられる可能性はあるけど、でも無駄なネストは減るよなぁ。
あと、エラーを拾わないプログラマを救ってあげるというのも分かりはするのですが...
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-04 11:14
C#のusingのような機構があればすっきりするんでしょうけどね。
guccii
会議室デビュー日: 2007/01/04
投稿数: 7
投稿日時: 2007-01-05 01:03
そうですねぇ。
それでちょっと思ったのですが、javaにプリプロセッサっていうか、Cでいうマクロ・マクロ関数が欲しくないですか?(話が飛んでしまって申し訳ありません)
usingもそうですし、assertとかもそうだったのですが、言語に組込むのもいいですけど、でも同じassertでもGUIアプリだとメッセージダイアログで出したいこととかもあるじゃないですかぁ。別にプロジェクト毎で用意するばいいものなのですが...。エラー処理・診断情報って結構この手のコードって多いでしょう?

また、自己解説的なコードを記述するためには、マクロは欠かせませんよね!!と私は思うのですが...。もしかしてこれって別のスレッドにした方がいいですか?

スキルアップ/キャリアアップ(JOB@IT)