アプリ版:「スタンプのみでお礼する」機能のリリースについて

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


よろしくお願いします

A 回答 (1件)

>> throw new Exceptionが出現したら、catchまでの処理をしないでとばすとゆうことですか?



はい。
代入において右オペランドで例外が発生した場合、その代入文は無効になります。
代入せずに直接echoしようとした場合も同様に、そのecho文は無効になります。



function hoge() {
 throw new Exception('エラーが発生しました');
 return 'hoge';
}
try {
 throw new Exception('エラーが発生しました');
 echo hoge(); // hoge() は実行されるがecho文は実行されない
} catch (Exception $e) {
 echo '例外発生', $e->getMessage(), "\n";
}

>> try~catchを抜けたら、他の処理は普通に実行されるのでしょうか?

はい。

>> try~catchのカッコ{で囲む範囲は大きくしたほうがいいでしょうか?(大きく囲むと処理スピードおそくなりますか?)

処理速度云々ではなく、 "意味" で囲う範囲を定めてください。



/* 初期化処理 */
$a = ...;
$b = ...;

/* ユーザーからの入力を受け取る */
try {
 
 if (!isset($_POST['input']) || !is_string($_POST['input'])) {
  throw new RuntimeException('パラメータが不正です');
 }
 if (preg_match('//u', $_POST['input']) === false) {
  throw new RuntimeException('不正なエンコーディングです');
 }
 if ($_POST['input'] === '') {
  throw new RuntimeException('1文字以上入力してください');
 }
 
 echo htmlspecialchars($_POST['input'], ENT_QUOTES, 'UTF-8');
 
} catch (RuntimeException $e) {
 
 printf("例外発生: %s\n", $e->getMessage());
 
}


上記の例でも使用していますが、可能な限りExceptionクラスの代わりにその継承クラスである「RuntimeException」や「LogicException」を使ったほうがいいと思います。前者は実行時に発生するかもしれない例外、後者は発生してはいけない例外(コーディングミスなど)です。それらにもさらに継承クラスがあるのでそれを用いるとさらに例外が細分化できていいと思います。
http://qiita.com/mikakane/items/dafd3d28c27311e5 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます
try~catch理解できました。これから積極的に使っていこうと思います

お礼日時:2013/09/30 21:52

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