php的错误处理方法可以通过以下方式重写(在代码开始的地方自定义即可):
error_reporting(0);//0为不输出PHP自带的错误输出,E_ALL为所有的警告和错误都输出
set_error_handler([__CLASS__, 'appError']);
set_exception_handler([__CLASS__, 'appException']);
register_shutdown_function([__CLASS__, 'appShutdown']);
CLASS就是当前类了(当然也可以写别的类),然后依次介绍下面的三个异常处理方法:
set_error_handler
字面意思就是自定义错误处理,也就是程序错误会使用这里自定义的错误处理方法,示例如下:
/**
* Error Handler
* @param integer $errno 错误编号
* @param integer $errstr 详细错误信息
* @param string $errfile 出错的文件
* @param integer $errline 出错行号
* @param array $errcontext
*/
public static function appError($errno, $errstr, $errfile = '', $errline = 0, $errcontext = [])
{
switch ($errno) {
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
ob_end_clean();
$errorStr = "$errstr ".$errfile." 第 $errline 行.";
self::halt($errorStr);
break;
default:
if(!empty(ob_get_contents())){
//清空缓存区
ob_end_clean();
}
$errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";
require SUNNY_PATH."tpl/error.php";
exit;
break;
}
}
set_exception_handler
自定义的异常处理,示例如下
/**
* Exception Handler
* @param \Exception|\Throwable $e
*/
public static function appException($e)
{
if (!$e instanceof \Exception) {
$e = new \Exception($e);
}
if (IS_CLI) {
echo $e->getMessage().PHP_EOL;die;
} else {
if(!empty(ob_get_contents())){
//清空缓存区
ob_end_clean();
}
$errorStr = $e->getMessage();
require SUNNY_PATH."tpl/error.php";
exit;
}
}
register_shutdown_function
程序中断异常处理,示例如下:
/**
* Shutdown Handler
*/
public static function appShutdown()
{
if ($e = error_get_last()) {
switch($e['type']){
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
self::halt($e);
break;
}
}
}
以上示例参考TP的错误处理,不过是参考的TP3