作成日:2018-05-25, 更新日:2025-11-18
基本
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してあげる必要アリ)
関連項目
・fuephpでトランザクション処理(try-catch())
・PHPで例外処理(try-catch()) チートシート