• ベストアンサー

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(); } よろしくお願いします

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

  • ベストアンサー
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% (4900/10358)
回答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