PHP错误处理异常处理类,依赖Monolog.
<?php
use Monolog\Level;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class ErrorHandel
{
private array $levels = [
\E_DEPRECATED => "Deprecated",
\E_USER_DEPRECATED => "User Deprecated",
\E_NOTICE => "Notice",
\E_USER_NOTICE => "User Notice",
\E_STRICT => "Runtime Notice",
\E_WARNING => "Warning",
\E_USER_WARNING => "User Warning",
\E_COMPILE_WARNING => "Compile Warning",
\E_CORE_WARNING => "Core Warning",
\E_USER_ERROR => "User Error",
\E_RECOVERABLE_ERROR => "Catchable Fatal Error",
\E_COMPILE_ERROR => "Compile Error",
\E_PARSE => "Parse Error",
\E_ERROR => "Error",
\E_CORE_ERROR => "Core Error",
];
private array $loggers = [
\E_DEPRECATED => [null, "LogLevel::INFO"],
\E_USER_DEPRECATED => [null, "LogLevel::INFO"],
\E_NOTICE => [null, "LogLevel::WARNING"],
\E_USER_NOTICE => [null, "LogLevel::WARNING"],
\E_STRICT => [null, "LogLevel::WARNING"],
\E_WARNING => [null, "LogLevel::WARNING"],
\E_USER_WARNING => [null, "LogLevel::WARNING"],
\E_COMPILE_WARNING => [null, "LogLevel::WARNING"],
\E_CORE_WARNING => [null, "LogLevel::WARNING"],
\E_USER_ERROR => [null, "LogLevel::CRITICAL"],
\E_RECOVERABLE_ERROR => [null, "LogLevel::CRITICAL"],
\E_COMPILE_ERROR => [null, "LogLevel::CRITICAL"],
\E_PARSE => [null, "LogLevel::CRITICAL"],
\E_ERROR => [null, "LogLevel::CRITICAL"],
\E_CORE_ERROR => [null, "LogLevel::CRITICAL"],
];
private Logger $log;
public function __construct()
{
set_error_handler([$this, "errorHandler"]);
set_exception_handler([$this, "exceptionHandler"]);
register_shutdown_function([$this, "shutdownFunction"]);
$this->log= new Logger('errorlog');
$this->log->pushHandler(new StreamHandler('error.log', Level::Warning));
}
public function shutdownFunction()
{
$lasterror = error_get_last();
if ($lasterror == null) {
return;
}
switch ($lasterror['type']) {
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_PARSE:
$error = "[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line'];
if (env('APP_DEBUG')) {
print_r($error);
}
$this->logError($error, "error");
//mylog($error, "fatal");
}
}
public function exceptionHandler($exception)
{
$errorinfo = "Exception: " . $exception->getMessage() . " at Line:" . $exception->getLine() . " in File:" . $exception->getFile();
$errorinfostr = $exception->getMessage();
if ($errorinfostr == "404 Not Found") {
//"404 Not Found" should throw by your router
http_response_code(404);
include "../404.html";
} else {
http_response_code(500);
$this->logError($errorinfo, "error");
if (!env('APP_DEBUG')) {
$errorinfo = "500 Internal Server Error";
}
include "../500.html"; //echo $errorinfo in 500.html
}
}
public function errorHandler($severity, $message, $file, $line)
{
$full_msg=$message . " at Line:" . $line . " in File:" . $file;
throw new ErrorException($this->friendlyErrorType($full_msg, $severity) . ":" . $message, 0, $severity, $file, $line);
}
public function friendlyErrorType($error, $type)
{
switch ($type) {
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_PARSE:
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
$this->logError($error, "error");
return 'error';
break;
case E_USER_DEPRECATED:
case E_DEPRECATED:
$this->logError($error, "info");
return "info";
break;
case E_NOTICE:
case E_USER_NOTICE:
case E_STRICT:
case E_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_USER_WARNING:
$this->logError($error, "warning");
return 'warning';
break;
default:
$this->logError($error, "warning");
}
return "";
}
public function logError($err, $level)
{
$this->log->$level($err);
}
public function __destruct()
{
restore_error_handler();
restore_exception_handler();
}
}
相关博文
PHP错误处理异常处理类