読者です 読者をやめる 読者になる 読者になる

print 'Hello World!';

hogehoge備忘録

例外処理とエラーログ出力

php

#ポイント

どのような例外処理、ログを出力するかは、トラブル(システムエラーや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:~}:コンテクスト

#ララベルログ出力参考サイト

[Laravel]Laravel5.1のログ出力に関して調査したまとめ - Qiita