- ベストアンサー
PHP5の例外処理について。
PHP5からtry, catchが実装されたのですが、以下の点がわからないです。 他の言語のような、finallyはないのでしょうか? (正常でも異常でも必ず実行する箇所のことです。) 可能であれば、サンプルを提示していただけるとありがたいです。 ご回答、よろしくお願いします。
- TERIYAKIcom
- お礼率88% (70/79)
- PHP
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
がると申します。 PHP5では、少なくとも現在の5.1.2までの間ではfinallyは無かったかと。 # ちなみにC++もないです。
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
参考URLがローカルになってました^^; 訂正 http://www.php.net/manual/ja/language.exceptions.php
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
PHP5の場合 try で例外が発生しても、その後の文は(正常でも異常でも)実行されます。(なのでfinally は構文としては必要ない) 例: <?php function div($a, $b) { try { if($b==0) throw new Exception("0での割り算はできません"); $ret=$a/$b; #例外が発生したら実行されない } catch (Exception $e) { echo '例外発生', $e->getMessage(), "\n"; } echo "$a/$b\n"; #異常正常に関係なく実行される return $ret; } $ret=div(10, 3); print "ret:$ret\n"; $ret=div(10, 0); print "ret:$ret\n"; ?>
お礼
回答ありがとうございます。 確かに、そうなのですが Java言語でのfinallyは、catch内でthrowやreturnした場合でも処理を行ってくれたので そのようにできたらソースコードが見やすくなるのではないかな。と思ってこの質問をさせていただきました。
関連するQ&A
- 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#
- 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
- 例外処理の付け方
javaを使って通信のプログラムを作成しています。 ホストAで送信データを作成し、そのデータをホストBに送信して、 ホストAが送信するのにかかった時間と、ホストBが受信するのにかかった時間を 計測するプログラムを作成しました。 送信と受信の処理を行うのですが、送信側では、write()でバッファに書き込んで、 fulsh()で書き込まれたバイトを出力ストリームに書き込みます。 受信側では、while((ch=in.read()) != -1)で送信データをすべて読み込ませます。 write()、fulsh()を使って送信し、read()で受信するのですが、 これらのメソッドが正常に動いたかどうかを調べたいのです。 ネットで方法を調べたのですが、try catchを使うことで例外処理が発生したら、 エラーを出力させることができることがわかりました。 もしurite(),fulsh(),read()が正常に起動しないならエラーを出したいのです。私なりに考えて以下のようにしました。 コードは以下のとおりです。送信部分、受信部分です。 送信側 int count = 0; // write()の回数 System.out.println("<データ送信処理>"); start = System.nanoTime(); // 計測開始時間 for (int i = 0; i < Data - 2; i++) { try { out.write(i); count++; } catch (IOException e) { System.out.println(i + ":書き込みエラー"); } } try{ out.write('\\'); }catch(IOException e){ System.out.println("\\" + "書き込みエラー"); } try{ out.write('s'); }catch(IOException e){ System.out.println("s" + "書き込みエラー"); } count = count + 2; out.flush(); stop = System.nanoTime(); // 計測終了時間 System.out.println("送信完了"); 受信側 while (ch != -1) { try{ ch = in.read(); }catch(IOException e){ System.out.println("読み込みエラー"); } Count++; if (ch == '\\') { on = true; } else if (on == true && (char) ch == 's') { stopNs = System.nanoTime(); System.out.println("受信終了時間を確認"); break; } else if (on == true && (char) ch != 's') { on = false; } } メソッドが正常に起動しない場合は、例外処理を行うということを したいのですが、上の方法は正しいのでしょうか? このようにして実行しても、「入力エラー」と言う表示はされません。 もしかしたら、ただ異常な動作が行われていないから、そういったエラーが 表示されないのかもと考えましたが、例外処理の書き方が違う可能性があると思い、 質問させていただきました。 どなたかアドバイスしていただけないでしょうか?
- ベストアンサー
- Java
- PHPが軽いのはなぜ?
PHPは実行速度が速いとかよく聞くのですが、それは何故ですが? 分かり易く教えていただけると嬉しいです。参考になるサイトでも構いません。将来自作プログラミング言語を作りたいので、その時の参考にしたいのです。回答よろしくお願いします。
- ベストアンサー
- PHP
- try catchについて
try catchの動きで質問があります。 以下が簡略化したソースです。 -------ここから--------------------- ストリーム1; ストリーム2; try{ try{ //ストリーム1を使った処理 }catch(IOException e){ throw e; }finally{ //ストリーム1のクローズ } try{ //ストリーム2を使った処理 }finally{ //ストリーム2のクローズ } } catch(IOException e){ throw new hogeException(); } ------ここまで-------------------------- 内側でスローされた例外は、外側でcatchされるのですか? また、内側でcatchをしなかった場合、外側でcatchされるのですか? この2点を教えていただきたいです。 よろしくお願いします。
- ベストアンサー
- Java
- PHPのインストールについて教えてください。
linux9にapache2.0.54 PHP4.4.0 をインストールしたのですが、phpinfo.phpというサンプルをつくり実行すると、 Forbidden You don't have permission to access /phpinfo.php ======================== Apache/2.0.54(Unix) mod_jk2/2.0.4 PHP/4.4.0 Server at 127.0.0.1 Port 80 と表示されてしまいます。 PHP初心者なのでどなたか助けていただけませんか? よろしくお願いします。 indexページやCGIは正常に動いています。
- ベストアンサー
- PHP
- PHP に詳しい方教えてください
PHPを勉強していて、以下のサンプルに出会ったのですが、これについて 2 点教えてください。 (1) <?php?> の括りを分ける理由。 (2) $data は、なぜカッコに入れられているのか。 <?php $date = sprintf('%04d年 %02d月 %02d日',2013, 1, 23); ?> <?php print ($date); ?>
- ベストアンサー
- PHP
- finally ってどのようなときにつかうんですか?
処理A try 処理B catch 処理C finally 処理D ---------------------- 処理A try 処理B catch 処理C 処理D ---------------------- 以上2種類 どのみち 処理Dはとおりますよね? いったいどのような場合使うのでしょうか? 言葉で書くのが難しいのならソースでも構いません・・。 (言語はできたら VBかC#)
- 締切済み
- その他(プログラミング・開発)
- PHP System関数が動作しません
サーバー上の、あるphpファイル(sample_c.php)をシステム関数を使用して実行する必要があり、以下の流れのプログラムを作成しました。 sample_a.php でSubmit sample_b.php でSystem関数でsample_c.phpを呼び出し sample_c.php で実行 です。 <? /* sample_a.php */ ?> <form action="sample_b.php" method="post"> <input type="hidden" name="login" value="sample_user"> <input type="hidden" name="action" value="trigger_b"> <input type="submit" value="submit"> </form> <? /* sample_a.php */ ?> <? if($_POST['action'] =="trigger_b") { $login = $_POST['login']; system("sample_c.php $login"); header('Location: sample_a.php?action=fin'); exit; } else { header('Location: sample_a.php?action=error'); exit; } ?> <? /* sample_c.php */ ?> $_SERVER['argv'] で受け取った値を処理 ----------------- 3つのファイルは全て同じ階層に配置してあります。 sample_a.phpでsubmitすると、sample_a.php?action=fin にリダイレクトするのですが、 sample_c.php内の動作が実行されていません。 中身はDB接続して、テーブルに保存する単純なsql文が入っていて、sample_c.php単体での動作は確認しています。 (単体テストの場合は$_SERVER['argv']の代わりに変数に値をセットして実行しています。) System関数で変数を受け渡さずに system("sample_c.php $login"); を system("sample_c.php") として実行してもうまくいきません。; 原因が分かるかたがいらっしゃれば教えてください。 お願いします。
- ベストアンサー
- PHP
- Oracleに接続すると、それ以降の処理を素通りしてしまう
下記のようなメソッドで<1><2>の後、すぐに<7>に処理をしてしまいます。 <1>~<7>と動くと思っていたのですが、<3>~<6>が全て無視されます。 どこか問題があるのでしょうか? ちなみに、<1>で無効なURLを指定するとSQLExceptionでcatchされます。 try { Class.forName("oracle.jdbc.OracleDriver"); try { //<1> conn = DriverManager.getConnection (URL, UID, PSW); //<3> System.out.println("Oracleと接続しました"); } catch (SQLException e) { System.out.println("oracle接続エラー"); } catch (Exception e) { System.out.println("oracle接続エラー"); } //<4> try { //<5> stmt = conn.createStatement(); //<6>sql文の作成 // select文の実行 //(略) } catch (Exception ex3) { System.out.println("なんかエラーです"); } } catch (Exception e){ System.out.println("その他エラーです"); //<2> } finally { //特になし } //<7> return list;
- ベストアンサー
- Java
お礼
ありがとうございます。 やはり無いですよね。 教えていただきとても助かりました。