結論
-
throw
されるとcatch
へ飛ぶ - Uncaughtおよび
throw
するオブジェクトが不正な場合は、Fatal errorになる - よって、
throw
より後のコードへは到達しない。
見かけたコード
メソッド内の記述
try {
// hogehoge
} catch (Exception $e) {
throw new Exception(/* hugahuga */);
return;
}
静的解析でもunreachableと出ていたのだが、不安になったので念のため。
どんなケースが考えられるか
throw
したのに次の行へ行く…
ざっと考えてみて、やはりエラー関係で起きそうかなと思ったので列挙してみる。
- 例外が
catch
されない - 不正な値が
throw
される - 上記のエラーから意図的に復帰する
列挙と言ってもこの位しか思いつかない。
では、試す。
検証コード
<?php
// http://ngyuki.hatenablog.com/entry/2013/12/24/182034 お借りしました
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
echo "Error[$errno]: $errstr\n";
});
try {
// 複数throwを書いているのは便宜上
throw new aException; // PHP Fatal error: Class 'aException' not found
throw new StdClass; // PHP Fatal error: Exceptions must be valid objects derived from the Exception base class
throw null; // PHP Fatal error: Can only throw objects
throw new Exception; // PHP Fatal error: Uncaught exception 'Exception'
echo 'reach!';
} catch (RuntimeException $e){
}
以上、E_RECOVERABLE_ERROR
でもないFatal errorでした。
なので復帰も不可。
ちなみに、
PHP: set_exception_handler - Manual
は
PHP: set_error_handler - Manual
と異なり、次の命令に継続されることはありません。
一度、set_exception_handler
内でtrigger_error
してset_error_handler
で継続させるというよくわからないこともしてみましたが、継続先は当然set_error_handler
内になり意味は無いです。
おまけ
<?php
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
echo "Error[$errno]: $errstr\n";
});
try {
throw new Exception;
hell:
echo "Welcome to ようこそ 地ャパリパーク";
} catch (Exception $e){
goto hell;
}