「PHP開発APPインタフェース実戦003」カスタム異常処理
4460 ワード
実際の開発では,誤りや異常捕捉はtry{}catch()だけでは十分ではない.安全のため、2つのPHP内蔵方法set_を使用しました.error_handlerとset_exception_handlerは標準的なPHPエラー処理関数を迂回し、カスタムエラーメッセージと記録エラーログを出力します.
エラー・ログの記録
デバッグとエラー位置の検索を容易にするために、エラー情報をブロックするたびに、エラー情報をログファイルに記録します.
エラー情報には、エラー時間、エラー情報、エラーファイル、エラー行が含まれます.例:
エラーメッセージの出力
ブロックされたエラー情報を標準JSONインタフェース形式にカプセル化し、インタフェースページに出力してコード実行を終了します.ここでは、デバッグ機能をオンにすると、開発時にデバッグして使用できるように、デバッグをオンにするかどうかも設定しています.例:
カスタムエラー処理関数
組み込み関数set_の使用error_handlerはエラーをブロックし、log_を呼び出します.writeとerror_output
カスタム例外処理関数
組み込み関数set_の使用exception_handlerは例外をブロックし、log_を呼び出します.writeとerror_output
完全なコード
パス:/public/exception.php
エラー・ログの記録
デバッグとエラー位置の検索を容易にするために、エラー情報をブロックするたびに、エラー情報をログファイルに記録します.
/**
*
* @param $error_code
* @param $error_message
* @param $error_file
* @param $error_line
*/
function log_write($error_code, $error_message, $error_file, $error_line)
{
$log = date('Y-m-d H:i:s');
$log .= ' | ' . '[' . $error_code . '] ';
$log .= $error_message . PHP_EOL;
$log .= $error_file . ', line : ' . $error_line . PHP_EOL;
$filename = LOG_PATH . '/' . date('Ymd') . '.log';
file_put_contents($filename, $log . PHP_EOL, FILE_APPEND);
}
エラー情報には、エラー時間、エラー情報、エラーファイル、エラー行が含まれます.例:
2017-12-14 06:42:45 | [2] Division by zero
D:\Fox\DingDangBike\Code\app\1.0.0\controllers\IndexController.php, line : 7
エラーメッセージの出力
/**
*
* @param $message
* @param $code
* @param string $track
*/
function error_output($message, $code, $track = null)
{
$error = [
'status' => '0',
'code' => $code . '',
'message' => $message,
];
$options = null;
$config = new Phalcon\Config\Adapter\Php(PHP_CONFIG_PATH);
//
if ($config->debug && $track) {
$error['track'] = $track; //
$options = $options | JSON_UNESCAPED_UNICODE; //
}
die(json_encode($error, $options));
}
ブロックされたエラー情報を標準JSONインタフェース形式にカプセル化し、インタフェースページに出力してコード実行を終了します.ここでは、デバッグ機能をオンにすると、開発時にデバッグして使用できるように、デバッグをオンにするかどうかも設定しています.例:
{
"status": "0",
"code": "500",
"message": "Division by zero",
"track": "D:\\Fox\\DingDangBike\\Code\\app\\controllers\\IndexController.php, line : 17"
}
カスタムエラー処理関数
組み込み関数set_の使用error_handlerはエラーをブロックし、log_を呼び出します.writeとerror_output
set_error_handler(function ($error_code, $error_message, $error_file, $error_line) {
log_write($error_code, $error_message, $error_file, $error_line);
error_output($error_message, 500, $error_file . ', line : ' . $error_line);
});
カスタム例外処理関数
組み込み関数set_の使用exception_handlerは例外をブロックし、log_を呼び出します.writeとerror_output
set_exception_handler(function (Exception $e) {
log_write($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
error_output($e->getMessage(), 300, $e->getFile() . ', line : ' . $e->getLine());
});
完全なコード
パス:/public/exception.php
'0',
'code' => $code . '',
'message' => $message,
];
$options = null;
$config = new Phalcon\Config\Adapter\Php(PHP_CONFIG_PATH);
//
if ($config->debug && $track) {
$error['track'] = $track; //
$options = $options | JSON_UNESCAPED_UNICODE; //
}
die(json_encode($error, $options));
}
set_error_handler(function ($error_code, $error_message, $error_file, $error_line) {
log_write($error_code, $error_message, $error_file, $error_line);
error_output($error_message, 500, $error_file . ', line : ' . $error_line);
});
set_exception_handler(function (Exception $e) {
log_write($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
error_output($e->getMessage(), 300, $e->getFile() . ', line : ' . $e->getLine());
});