作成日:2018-05-25, 更新日:2019-03-13
基本
try { if ( 〇〇〇 ) { throw new Exception(〇〇〇); } } catch (Exception $e) { echo $e->getMessage(); }
DBが絡むとき
DBのテーブルが「InnoDB」のときのみロールバックさせることができる。
try { ~ トランザクションをスタートさせる ~ if ( 〇〇〇 ) { throw new Exception(〇〇〇); } ~ コミットさせる ~ } catch (Exception $e) { ~ ロールバックさせる ~ echo $e->getMessage(); }
FeulPHPのときのサンプル:fuephpでトランザクション処理(try-catch())
想定外のエラーをcatchしたとき
たとえば・・・「$hoge=false」なのに「$hoge['zebra']」を参照したりするとcatchされてしまう。
そのときの処理を分岐させたい
function initCatch($e) { switch(getErrType($e->getCode()) { case 0: $err = ''; break; // throw new Exception()されたヤツ。 case E_ERROR: $err = 'E_ERROR'; break; // 1 case E_WARNING: $err = 'E_WARNING'; break; // 2 case E_PARSE: $err = 'E_PARSE'; break; // 4 case E_NOTICE: $err = 'E_NOTICE'; break; // 8 case E_CORE_ERROR: $err = 'E_CORE_ERROR'; break; // 16 case E_CORE_WARNING: $err = 'E_CORE_WARNING'; break; // 32 case E_COMPILE_ERROR: $err = 'E_COMPILE_ERROR'; break; // 64 case E_COMPILE_WARNING: $err = 'E_COMPILE_WARNING'; break; // 128 case E_USER_ERROR: $err = 'E_USER_ERROR'; break; // 256 case E_USER_WARNING: $err = 'E_USER_WARNING'; break; // 512 case E_USER_NOTICE: $err = 'E_USER_NOTICE'; break; // 1024 case E_STRICT: $err = 'E_STRICT'; break; // 2048 case E_RECOVERABLE_ERROR: $err = 'E_RECOVERABLE_ERROR'; break; // 4096 case E_DEPRECATED: $err = 'E_DEPRECATED'; break; // 8192 case E_USER_DEPRECATED: $err = 'E_USER_DEPRECATED'; break; // 16384 default: $err = 'unknown(' . $errCode . ')'; break; } if ( $err != '' ) { // PHPエラー系。ログ出力やメールを飛ばしたり・・・ echo $err; exit; } else { // ただの例外処理なのでココでは何もしない // ※何かさせてもOK。 } } try { if ( 〇〇〇 ) { throw new Exception(〇〇〇); } } catch (Exception $e) { // PHPのエラーのときもcatchされるので、先にチェック initCatch($e); // 想定したcatch。 echo $e->getMessage(); }
エラーになった場所が知りたい
・「debug_backtrace()」ではなく「$e->getTrace()」or「$e->getTraceAsString()」を使う。
~略~ catch (Exception $e) { ~略~ var_dump($e->getTrace()); // 「debug_backtrace()」同様、配列が入っているので必要な部分のみ出力としないと、見るのが面倒 // echo $e->getTraceAsString(); }
▼基本、下記が似たような感じの組合せ
・「var_dump(debug_backtrace());」と「var_dump($e->getTrace());」
・「debug_print_backtrace();」と「echo $e->getTraceAsString();」(※「debug_print~」は即出力するけど、「$e->~」はechoしてあげる必要アリ)