答案:通过set_exception_handler()捕获未捕获异常,结合set_error_handler()将错误转为异常,实现统一处理。具体包括:1. 定义handleException函数记录日志并根据环境显示错误信息或友好页面;2. 使用handleError函数将PHP错误转为ErrorException抛出;3. 创建error_page.php作为生产环境下的统一错误展示页面;4. 推荐封装为ErrorHandler类,区分开发与生产环境配置,集成日志记录与监控,提升应用健壮性。

PHP中实现全局异常处理,关键在于利用set_exception_handler()函数捕获未被捕获的异常,并结合错误与异常的统一管理机制,实现友好的错误展示或日志记录。下面介绍如何构建一个实用的全局异常处理方案和统一错误页面。
1. 设置全局异常处理器
使用set_exception_handler()可以指定一个自定义函数来处理所有未被try...catch捕获的异常。
function handleException($exception) {
// 记录异常信息到日志
error_log("Uncaught Exception: " . $exception->getMessage() . " in " .
$exception->getFile() . " on line " . $exception->getLine());
// 显示友好错误页面(生产环境)
if (!ini_get('display_errors')) {
include 'error_page.php';
} else {
// 开发环境显示详细错误
echo "系统异常:
";
echo "消息:" . $exception->getMessage() . "
";
echo "文件:" . $exception->getFile() . "
立即学习“PHP免费学习笔记(深入)”;
";
echo "行号:" . $exception->getLine() . "
";
echo "" . $exception->getTraceAsString() . "
";
}
}
// 注册异常处理器
set_exception_handler('handleException');
2. 统一处理PHP错误(转为异常)
PHP的很多错误(如E_WARNING、E_NOTICE)不属于异常,无法被try...catch捕获。可以通过自定义错误处理器将其转为异常,交由异常处理器统一处理。
function handleError($severity, $message, $file, $line) {
// 将错误转为ErrorException抛出
throw new ErrorException($message, 0, $severity, $file, $line);
}
// 注册错误处理器
set_error_handler('handleError');
// 可选:定义哪些错误级别需要转换
error_reporting(E_ALL);
3. 实现统一错误页面
创建一个简洁的错误提示页面error_page.php,用于在生产环境中向用户展示。
系统错误
4. 应用场景建议
在实际项目中,可将上述逻辑封装为一个ErrorHandler类,便于复用和配置环境模式。











