PHPで例外処理(try-catch())

例外処理は・・・「throw new Exception」のスペルを覚えるのに時間がかかる。コピペばっかりだから余計に時間がかかる。

作成日: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してあげる必要アリ)

関連項目

fuephpでトランザクション処理(try-catch())