電子書籍の厳選無料作品が豊富!

プログラム初心者です

繰り返し処理の中でtry~catchにスローしてもいいでしょうか?(正常にfor文は終了しますか?)

try {

for($a = 0; $a < 5; $a++) {
if($a==3){
throw new Exception('3');
}

} catch (Exception $e) {
$msg = $e->getMessage();
}

よろしくお願いします

A 回答 (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/dafd3d28c27311e5 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/03 10:24

正常にforが終了というか、forから抜け出します。



質問文のコードだと } が1つ足りないので文法エラーですが。

学習するつもりなら、手元にPHPを実行できる環境を作った方が良いですよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/02 23:36

なぜ試さないのですか?

    • good
    • 0
この回答へのお礼

テストはしていますが
理解しないで使っていると使うたびに「これ一応動いたし大丈夫かな?・・・」 と余計な思考をしてしまうほうなのでしっかりと学びたいと思っています
あと、カッコがぬけていました。すいません
try {

for($a = 0; $a < 5; $a++) {
if($a==3){
throw new Exception('ip');
}
}//for終了
} catch (Exception $e) {
$msg = $e->getMessage();
}

お礼日時:2014/02/02 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!