例外処理とエラーログ出力
#ポイント
どのような例外処理、ログを出力するかは、トラブル(システムエラーやDB接続、DB更新の失敗など)が発生したときにどのようなログがあれば運用対応上適切かを考えるとよい。
#ログを出力して例外をスロー
Utilクラス
//exitErrorメソッド public static function exitError($errNumber, $errDetail, $context){ //ログ出力 Logger::errorWithContext($errNumber, $errDetail, $context); //例外をスロー throw new HogeException(Logger::getMessage($errNumber).$errDetail, $errNumber); }
Loggerクラス
//エラーコード const ERR_CODE_9000='9000'; const ERR_CODE_9001='9001'; //エラーコード表(エラーコード=>エラーメッセージ) const ERRTABLE=[ self::ERR_CODE_9000=>'bad request', self::ERR_CODE_9001=>'system error' ]; //errorWithContextメソッド public static function errorWithContext($errCode, $options, array $context){ //ララベルでのログ出力方法 Log::error(static::errMes($errCode, $options), $context); } //getMessageメソッド public static function getMessage($errCode){ return self::ERRTABLE[$errCode]; } //errMesメソッド public static function errMes($errCode, $options){ $errMes= '['.$errCode.'] '.ERRTABLE[$errCode]; if(is_array($options)){ foreach($key=>$value){ $optionAry[]=$key. ':'.$value; } $options= implode(',',$optionAry); } $errMes .= '('.$options.')'; return $errMes; }
#実装例
Util::exitError(Logger::ERR_CODE_9000, '(parameter:'.$param.')', ['file'=>__FILE__, 'line'=>__LINE__]); try{ //何らかのメソッドを実行 $response=$logic->execute(); } catch(HogeException $e){ //実行の結果、スローされたHogeExceptionをキャッチ $response['FAULT_CODE']= $e->getCode(); $response['FAULT_STRING']= $e->getMessage(); } //$responseをjson形式で返す場合 return json_encode($response);
#ログ出力例
[2016-12-13 10:42:02][ERROR]:[3000] No data exists.(ID:001) {file:~,line:~}
ERROR:エラーログレベル
3000:エラーコード
No data exists. (ID:001):エラーメッセージと付加情報
{file:~,line:~}:コンテクスト