本文目录导读:

在PHP项目中,set_error_handler 和 restore_error_handler 是用于自定义错误处理的重要函数,下面是它们的详细说明和使用示例:
set_error_handler()
设置用户自定义的错误处理函数。
基本语法
set_error_handler(callable $callback, int $error_types = E_ALL | E_STRICT): ?callable
参数说明
- $callback: 自定义错误处理函数
- $error_types: 要处理的错误级别(默认处理所有错误)
回调函数格式
function handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext): bool
restore_error_handler()
恢复之前(上一个)错误处理函数。
基本语法
restore_error_handler(): bool
实际应用示例
基础示例
<?php
// 自定义错误处理函数
function customErrorHandler($errno, $errstr, $errfile, $errline) {
echo "错误信息:[$errno] $errstr\n";
echo "错误文件:$errfile (第 $errline 行)\n";
return true; // 阻止PHP内置错误处理
}
// 设置自定义错误处理器
set_error_handler('customErrorHandler');
// 触发错误测试
echo $undefinedVariable; // 触发警告
// 恢复默认错误处理
restore_error_handler();
类方法作为处理器
<?php
class ErrorManager {
public function handleError($errno, $errstr, $errfile, $errline) {
$log = sprintf("[%s] %s in %s line %d\n", $errno, $errstr, $errfile, $errline);
file_put_contents('error.log', $log, FILE_APPEND);
return true;
}
}
$errorManager = new ErrorManager();
// 设置类方法为错误处理器
set_error_handler([$errorManager, 'handleError']);
// 触发错误
trigger_error("这是一个测试错误", E_USER_WARNING);
// 恢复错误处理
restore_error_handler();
按错误级别处理
<?php
function errorLogger($errno, $errstr, $errfile, $errline) {
$errorTypes = [
E_WARNING => '警告',
E_NOTICE => '通知',
E_USER_ERROR => '用户错误',
E_USER_WARNING => '用户警告',
E_USER_NOTICE => '用户通知'
];
$type = $errorTypes[$errno] ?? '未知错误';
$message = "[$type] $errstr (文件: $errfile, 行: $errline)\n";
error_log($message, 3, 'errors.log');
echo $message;
return true;
}
// 只处理警告和通知级别错误
set_error_handler('errorLogger', E_WARNING | E_NOTICE);
// 触发不同级别错误
echo $undefinedVar; // notice
$result = 1 / 0; // warning
restore_error_handler();
嵌套使用场景
<?php
function firstHandler($errno, $errstr, $errfile, $errline) {
echo "第一个处理器:$errstr\n";
return true;
}
function secondHandler($errno, $errstr, $errfile, $errline) {
echo "第二个处理器:$errstr\n";
return true;
}
// 设置第一个处理器
set_error_handler('firstHandler');
trigger_error("第一个错误");
// 设置第二个处理器(会替换第一个)
set_error_handler('secondHandler');
trigger_error("第二个错误");
// 恢复上一个处理器(回到第一个)
restore_error_handler();
trigger_error("第三个错误");
// 再次恢复(回到默认处理器)
restore_error_handler();
完整项目示例:错误日志系统
<?php
class ErrorHandler {
private $logFile;
private $originalHandler;
public function __construct($logFile = 'errors.log') {
$this->logFile = $logFile;
}
public function register() {
// 保存原始处理器
$this->originalHandler = set_error_handler([$this, 'handleError']);
}
public function handleError($errno, $errstr, $errfile, $errline) {
$errorType = $this->getErrorType($errno);
$message = sprintf(
"[%s] %s | 文件: %s | 行: %d | 时间: %s\n",
$errorType,
$errstr,
$errfile,
$errline,
date('Y-m-d H:i:s')
);
// 记录到文件
file_put_contents($this->logFile, $message, FILE_APPEND);
// 开发环境显示错误
if (defined('ENVIRONMENT') && ENVIRONMENT === 'development') {
echo $message;
}
// 根据错误类型处理
switch ($errno) {
case E_USER_ERROR:
// 严重的用户错误,可能需要终止
exit(1);
break;
default:
return true;
}
}
private function getErrorType($errno) {
$types = [
E_ERROR => 'Fatal Error',
E_WARNING => 'Warning',
E_PARSE => 'Parse Error',
E_NOTICE => 'Notice',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice'
];
return $types[$errno] ?? 'Unknown Error';
}
public function restore() {
restore_error_handler();
}
public function __destruct() {
$this->restore();
}
}
// 使用示例
$handler = new ErrorHandler('app_errors.log');
$handler->register();
// 触发一些错误
trigger_error("这是一个用户通知", E_USER_NOTICE);
trigger_error("这是一个用户警告", E_USER_WARNING);
echo $undefinedVariable; // 触发 notice
// 恢复默认处理器
$handler->restore();
注意事项
- 错误级别过滤:使用第二个参数控制处理的错误类型
- 返回值:返回
true阻止PHP默认处理,返回false继续默认处理 - 堆栈特性:支持嵌套使用,通过
restore_error_handler()恢复 - 无法捕获:不能捕获
E_ERROR、E_PARSE等严重错误 - 性能影响:自定义处理器会增加性能开销,生产环境谨慎使用
最佳实践
- 使用类封装,易于管理和复用
- 记录错误到日志文件而不是直接输出
- 根据环境(开发/生产)决定错误显示方式
- 配合
set_exception_handler()处理未捕获的异常 - 使用
error_reporting()控制错误报告级别
这种错误处理机制对于构建健壮的PHP应用非常重要,特别是在日志记录、错误报告和调试方面。