• ベストアンサー

try~catchについて

プログラム初心者です 繰り返し処理の中でtry~catchにスローしてもいいでしょうか?(正常にfor文は終了しますか?) try { for($a = 0; $a < 5; $a++) { if($a==3){ throw new Exception('3'); } } catch (Exception $e) { $msg = $e->getMessage(); } よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • PHP
  • 回答数3
  • ありがとう数14

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

例外がスローされたとき、完結していない操作は中断される、と覚えておくといいでしょう。ご提示の例であれば単純に $a のインクリメントは 3 になるまで済んでいますが、ここで以下のような例を考えてみましょう。 function div($a, $b) { if ($b == 0) { throw new InvalidArgumentException('Division by zero'); } return $a / $b; } try { $result = div(3, 0); } catch (Exception $e) { echo $e->getMessage(); } こちらの例では、$result に代入しようとした段階でまず div がコールされますが、途中で例外がスローされています。こういった場合では $result に対する操作は中断され、 $result は未定義の状態のまま catch ブロックに移行し、 $e に例外がセットされるということですね。 なお、例外の使い分けに関して…最初は「Exception」でひとまとまりでいいと思いますが、慣れて来たら最低限「LogicException」「RuntimeException」「ErrorException」の3つぐらいは区別してスローするようにした方が望ましいでしょう。 LogicException ソースコードを実行する前の段階で検出しなければいけない例外で、プログラマの誤りを示すのに使われます。 RuntimeException ユーザー入力・環境依存な情報を使う過程で発生してしまうかもしれない例外です。 ErrorException set_error_handler によるエラー→例外変換専用の例外です。 必ずしも LogicException と RuntimeException のどちらかに明確に分類できるということはありません。さきほどの div も「ユーザー入力をそのまま使うことを想定するなら RuntimeException」「プログラマ側に事前に検証させることを想定するなら LogicException」という2通りの解釈が出来ますね。 RuntimeException → 堂々と catch に含めてOK LogicException → 必ずしも catch に含めちゃダメというわけではないが、基本的に含めない方がいい ぐらいの感覚でいいと思います。 参考: PHP標準例外まとめ http://qiita.com/mikakane/items/dafd3d28c27311e5f429

flash0
質問者

お礼

回答ありがとうございます やっと理解できました。次から安心して使えます。 Exceptionを使い分けることも学べました。ありがとうございました

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

正常にforが終了というか、forから抜け出します。 質問文のコードだと } が1つ足りないので文法エラーですが。 学習するつもりなら、手元にPHPを実行できる環境を作った方が良いですよ。

flash0
質問者

お礼

すいません カッコ抜けていました

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

なぜ試さないのですか?

flash0
質問者

お礼

テストはしていますが 理解しないで使っていると使うたびに「これ一応動いたし大丈夫かな?・・・」 と余計な思考をしてしまうほうなのでしっかりと学びたいと思っています あと、カッコがぬけていました。すいません try { for($a = 0; $a < 5; $a++) { if($a==3){ throw new Exception('ip'); } }//for終了 } catch (Exception $e) { $msg = $e->getMessage(); }

関連するQ&A

  • try~catch

    php初心者です try~catchをわかりやすく教えてください throw new Exceptionが出現したら、catchまでの処理をしないでとばすとゆうことですか? try~catchを抜けたら、他の処理は普通に実行されるのでしょうか? try~catchのカッコ{で囲む範囲は大きくしたほうがいいでしょうか?(大きく囲むと処理スピードおそくなりますか?) try { throw new Exception('エラーが発生しました');  print "hoge"; } catch (Exception $e) {  echo '例外発生', $e->getMessage(), "\n"; }  print "foo"; よろしくお願いします

    • ベストアンサー
    • PHP
  • if文の書き方

    プログラム初心者です if文の処理速度が速いのは一般的に考えてどちらでしょうか? 別々にif文で処理する方法 try { if(!isset($_REQUEST['id'])&& !is_string($_REQUEST['id'])){ throw new Exception('error'); } if(!isset($_COOKIE['date'])&& !is_string($_COOKIE['date'])){ throw new Exception('error'); } } catch (Exception $e) { $msg = $e->getMessage(); } 一緒に処理する方法 try { if(!isset($_REQUEST['id']) && !is_string($_REQUEST['id']) && !isset($_COOKIE['date']) && !is_string($_COOKIE['date'])){ throw new Exception('error'); } } catch (Exception $e) { $msg = $e->getMessage(); } よろしくお願いします

    • ベストアンサー
    • PHP
  • try~catch構文は、どういうメリットがあるのですか?

    以下は 関数 hoge に失敗したら、例外を補足するコードです。 try {   if (!hoge()) {     throw new Exception('hogeに失敗しました');   } } catch (Exception $e) {   echo $e; } 以下のように書いたほうが分かりやすいと思いますが、 駄目なんでしょうか? hoge() || die('hogeに失敗しました'); ちなみに、DBのトランザクションを利用して、何かに失敗したら、 catch 以下でロールバックするのは便利だと思います。 しかし、こういう場合以外で、try~catch構文を使うメリットは何でしょう?

    • ベストアンサー
    • 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
  • try catch

    public String getMessage() { try { .... return "okay"; } catch (Exception e) { return "error"; } のように、エラーが起こったら catch 句で String を返すとうプログラムはありですか?

    • ベストアンサー
    • Java
  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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
  • どの例外でcatchすればいいのですか?

    例外の使い方を理解できていません。 さっき検索してみて下の質問と回答を見つけました。 例外処理がまったくわかりません!! http://www.okweb.ne.jp/kotaeru.php3?q=704380 この中の#2さんの回答、 >    catch (FileNotFoundException e){ ・・・ } >     catch (IOException e){ ・・・ } >   などと分けて書かなくとも、 >     catch (Exception e){ ・・・ } >   と書けば、すべての例外を処理できます。 を読むと「それなら、どんな例外でもすべて"(Exception e)"でcatchすればいいじゃん」と思うのですが駄目ですか? もし駄目ならどんな基準でExceptionを選んでいるのですか? 例えば、下のような二分検索木への挿入メソッドの場合、 どこでどのような例外を使ってcatchすればいいのですか? 私の思うような例外を入れてみましたが、どんなエラーが出るかも分からないし…。 だからと言ってthrow ~ catchを入れないとJBuilderが怒るんですよね…。 public void insert(int el) { IntBSTNode p = root, prev = null; try { while (p != null) { prev = p; if (p.key < el) p = p.right; else p = p.left; } if (root == null) root = new IntBSTNode(el); else if (prev.key < el) prev.right = new IntBSTNode(el); else prev.left = new IntBSTNode(el); } catch (Exception x) { System.out.println("エラーだ! 何か表示"); } } 分かる方、説明をお願いします。

    • ベストアンサー
    • Java
  • PDO で try~catch 構文を使う場所は?

    PHP5のPDOはtry~catch構文に対応しているのですが、どのように使えばいいのでしょうか? SQLを発行する度に、もしくはSQLを発行するメソッドの度に、try~catchしなければいけないのでしょうか?とても面倒です。 現時点では、例外が発生した時にする処理といえば、 trigger_error($e->getMessage(), E_USER_ERROR); みたいに、trigger_error するだけです。 であれば、そもそもcatchせずに、uncaught のまま勝手にエラったままに放っておいても問題ないのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • try ~ catch構文が使えない

    ロリポップサーバを利用しています。 http://lolipop.jp/?mode=manual&state=hp&state2=cgi try ~ catchやthrowでエラーがでます。 仕方なくcatch文を外したり、throwを使わない構文に していますが、どうも不安です。 try ~ catchやthrowを使えないとあきらめるしか ないのでしょうか? PHPのバージョンが対応していないのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう