• ベストアンサー

PHP5の例外処理について。

PHP5からtry, catchが実装されたのですが、以下の点がわからないです。 他の言語のような、finallyはないのでしょうか? (正常でも異常でも必ず実行する箇所のことです。) 可能であれば、サンプルを提示していただけるとありがたいです。 ご回答、よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 PHP5では、少なくとも現在の5.1.2までの間ではfinallyは無かったかと。 # ちなみにC++もないです。

TERIYAKIcom
質問者

お礼

ありがとうございます。 やはり無いですよね。 教えていただきとても助かりました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

参考URLがローカルになってました^^; 訂正 http://www.php.net/manual/ja/language.exceptions.php

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

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"; ?>

参考URL:
D:\Book\PHP\html\language.exceptions.html
TERIYAKIcom
質問者

お礼

回答ありがとうございます。 確かに、そうなのですが 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の部分にはどのような記述がなされるのでしょうか? よろしくお願いします

  • 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を使って通信のプログラムを作成しています。 ホスト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

専門家に質問してみよう