- ベストアンサー
DBのコネクションのclose処理で例外が発生した場合
ToOrisugaruの回答
通るすがるです。 >>この場合、おそらくcommitに問題がある可能性大ですね。 >>commitのエラーにより、closeが例外を引き起こすような感じだと思います。 >>片方だけの情報だと、私の見解としては推測が難しくなると思いますけど。 >そうですね。commitもですが、ハードや環境の問題でどっちも失敗するのかなと >思ったりします。ですので、基本的には例外をネストしてしまってもいい気はす >るのですが、それぞれ別の原因だった場合、解析時に混乱しそうな気もしたりし >ています。 たしかに、混乱はします。 ただ、エラー解析ってその場合、一つずつ問題を解決しそれをクリアしたら次の 問題を解決していくと思いますが、大多数のエラー解析時にはそのエラーのストー リー性を組み立てて(仮説)から修正したほうがより早く問題解決につながると 思います。仮に、エラー内容を束ねてしまった場合、その問題を解決し試験した 場合には、さらに別のエラーが発生してまた一から調査を開始することになり 非常に労力を要する結末を迎えることとなると思います。 >ただこのあたりのエラーがclose処理で出る時点で、commitも失敗するのではな >いかと思ってしまったりも・・・。もちろんcommit処理とclose処理の間のピン >ポイントで壊れたということは考えられますけれども。 >とここまで書きましたが、commitは成功したけど、そのあとデータが壊れました >ということですね。確かにその場合はユーザにメッセージを出す必要があります >ね。ただ例外処理が煩雑になるようなところが気になります。 そのとおりです。 ただ、煩雑になるかどうかはあなたの実力次第です。 SEとしての腕の見せ所です。 >発生した例外をすべて内包するようにした場合、発生した例外を変数に保持して、 >close処理で例外が発生した場合、保持した変数をチェックして例外をネストし >たりしなかったり。その方針だとcommit以外にもRuntime系の例外とかもcatchし >なければいけなくなりそうな・・・。 ここの気持ちは良くわかります。ただほかのオブジェクトとしての関係をこのレベル で関連づけてしまった場合、それはもうオブジェクトではなく構造化設計したものと 思います。そうなるとオブジェクト指向としての柔軟性に掛けてしまい結局この部品 は、他システムにおいて使用できないものと思います。 >いけない悪い癖で無用に範囲を広げている気がします。もっとシンプルに考えた >いのですが、どうもてんぱってくるとどうにも。 >頭を整理しなければ・・・。 そうですね、多分ここはロジックベースの指向になってしまって、つまり全ての処理 が2次元(平面的)になってしまい煩雑になってしまう要因とも言えますね。このよう な場合は設計方針を思い出し、つまり取り込み中のクラスは大前提として何をさせる クラスだったのかを思い出しながら整理しては如何でしょうか? 上の回答と同じようになってしまいましたが。
関連するQ&A
- close()で例外が投げられる理由
最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try { wt = new FileWriter("out.txt"); out.write("はろー"); } catch ( IOException e ) { e.printStackTrace(); } finally { try { if (out != null ) out.close(); } catch (IOException e) { e.printStackTrace(); } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。
- 締切済み
- Java
- 例外処理に関して
質問なのですが、よろしくお願い致します。 ファイルに空白行があった場合、任意に例外を発生させることをしているのですが、 (例外処理内容:ファイルにログを出力する) 例外が2回キャッチされているようで、2回目にファイル(ログファイル)は既に開かれています。というエラーが出ますが、以下のソースでは、呼出元と呼び出されたメソッドともに例外を処理してしまうのでしょうか? また、どう改善したらいいでしょうか? ご教授よろしくお願い致します。 呼出元 public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try Dim cls As New testClass cls.timer1() Catch e as Exception 'ログファイル出力 End Try End Sub 呼び出されるメソッド Public Sub Timer1() try FileOpen(1,"ファイルパス",OpenMode.Input) if Trim(LineInput(1)) = "" Then FileClose(1) Throw New Exception End If Catch e as Exception 'ログファイル出力 End Try End Sub
- ベストアンサー
- Visual Basic
- javaサーブレットからのoracle接続エラー
お世話になります。 javaサーブレットからoracleに接続する際、以下のエラーが発生して困っております。 エラー:java.sql.SQLRecoverableException: クローズされた接続です。 解決するための情報を頂けますでしょうか。 私がテストしている環境は、以下となります。 【Webサーバ】 centOS5.5. jdk1.6 tomcat5.5 【DBサーバ】 centOS5.5. oracle10g r2 jdbcドライバーは、ojdbc6.jarを使用しております。 サーブレット起動時にDB接続し処理完了時にDBクローズしていますが、DBクローズ処理にて 上記エラーが、発生してしまいます。 DB接続及びDBクローズは、以下のようにプログラミングしております。 /** * 概要 : DBアクセス * 処理 : DBアクセス */ public void dbAccess() throws Exception { conn = null; try { DriverManager.setLogWriter(new PrintWriter(System.out)); Class.forName(driver); conn = DriverManager.getConnection( jdbcPrefix + hotname + dbname, username,password); // 自動コミット・モードを設定(手動コミット) conn.setAutoCommit(false); }catch (SQLException e) { throw e; }catch (Exception e) { throw e; } } /** * 概要 : DBクローズ * 処理 : DBを閉じます。 */ public void dbClose() throws Exception { try { if (conn != null) conn.close(); }catch (Exception e) { throw e; } } お手数お掛け致しますが、ご教授宜しくお願い致します。
- ベストアンサー
- Java
- PHPの例外処理
PHPの例外処理について教えてください function test() { try{ $a = 10; $b = 0; $result = $a/$b; } catch(Exception $e){ //エラー処理 } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) { throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?
- ベストアンサー
- PHP
- 例外処理を条件式として使っていいのですか?
Java初心者です。 以下の様にしているのですが、 for(int i = 0; i < 10; i++){ try { NullPointerException 例外が出る処理 } catch (NullPointerException e) { break; //e.printStackTrace();//例外をコンソールに表示させない。 } } は、以下のようなforを使うのとどのはどちらがいいのでしょうか。 条件式がたくさん必要な場合があり、catch したほうが楽なような気がします。 for(int i = 0; i < 10; i++){ if(例外が出る処理==null){ break; } } また、安全性はどうなのでしょうか。 根本で間違っているのではないかと思い不安で質問しております。 お詳しい方がおられましたら教えて下さいませんでしょうか。 よろしくお願い致します。
- ベストアンサー
- Java
- 例外処理がまったくわかりません!!
下のプログラミングについていくつか質問があります。 (1)etest()メソッドってなんですか? (2)存在しないファイルを開くってどういうことですか? (3)FileReader( )対応catch節、Close( )対応catch節ってなんですか? (4)あと、プログラミングあとの本の解説の部分がよくわかりません。抜粋してみます。 「一般的な例外クラスはxxxExceptionというクラス名をしています。このタイプの例外クラスはみな「Exception例外クラス」をスーパークラスにしています。この場合、「catch(Exception e)」を使うとすべてのxxxException例外を補足できるという仕様になっています。ですから下のetest( )メソッドは次のように、ひとつのcatch節で記述することができます。このようにしても表示される4エラーメッセージ(eで指示)は、正しく発生例外(FileNotFoundExceptionまたはIOException) 対応のものになります。」 public static void etest( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } よろしくお願いします。
- ベストアンサー
- Java
- C++の例外処理について
C++にjavaのような例外処理ができるのを知りました 構文は try { stat1 } catch(except-decl) { stat2 } finally { stat3 } stat4 ただし stat1:例外が発生する可能性があるステートメント stat2:例外が発生したときに実行するステートメント stat3:例外が発生しなくても実行するステートメント stat4:ステートメント except-decl:捕獲する例外の宣言 です ここで質問です (1) 冷害が発生したときstat4は実行されるのでしょうか? されない場合にはその後どう言う処理がなされるのでしょうか? (2) except-declはどうのような記述がなされるのでしょうか? (4) 例外を発生させる構文 throw except (except:発生させる冷害) のexceptの部分にはどのような記述がなされるのでしょうか? よろしくお願いします
- ベストアンサー
- C・C++・C#
- データベース接続をどのように関数にすればよいか分かりません
この処理を何回か使うので関数にすることになりました。 しかし、例外を考えてtry、catchを使うとすると 処理を入れられないで接続終了になってしまいます。 throwsで全部例外をなげるしかないのでしょうか? 分かる方がいましたら、教えてください。 よろしくお願いします。 public void Connect()throws ServletException,IOException { try{ String drv = "org.gjt.mm.mysql.Driver"; String url = "jdbc:mysql://localhost/keijiban?useUnicode=true&characterEncoding=sjis"; String usr = ""; String pw = ""; Class.forName(drv); cn = DriverManager.getConnection(url,usr,pw); //処理を入れる所//////////////////////// }catch(Exception e){ e.printStackTrace(); } finally { if (cn != null) { try { cn.close(); } catch (SQLException e) { throw new ServletException(e); } } } }
- ベストアンサー
- Java
- PHP+MySQLでの排他処理とDBクローズ
<環境> Apache1.3.37 PHP4.4.6 MySQL4.0.27 PHPで、掲示板などのスクリプト作成を勉強しています。 これまで、ログをログファイルとして保存するように作成しておりましたが、データベースに保存するように変更している途中です。 そこで、教えていただきたいのは下記の2点です。 ・ロック処理の必要性 →ログファイルを作成するタイプの場合、同時アクセスによるファイル破損を防ぐため、ロック処理が必要でした。DBに変更した場合も同様に必要なのでしょうか? ・DBのクローズ処理 →最小限のソースを以下に記します。9行目のクローズ処理は必ず必要でしょうか?また、エラーが発生した場合、7行目で処理が終わるのですが、この直前にもクローズ処理を記入する必要があるのでしょうか? 1)<?php 2)$db = mysql_connect(host,user,pass); 3)mysql_select_db(db-name,$db); 4)$query = "INSERT INTO table(id,name) VALUES('1','なまえ')"; 5)if (!(mysql_query($query))) { 6) print = "書き込みに失敗しました。"; 7) exit(); 8)} 9)mysql_close($db); 10)?> 宜しくお願いします。
- ベストアンサー
- PHP
お礼
お返事ありがとうございます。 勉強になります。まだ頭の中が整理し切れていませんが、アドバイス頂いたことをうまく消化できるにようにがんばってみます。 ありがとうございました。