php自定义错误提示的核心是set_error_handler()拦截非致命错误,配合trigger_error()主动抛出、关闭display_errors防信息泄露,并需注意与第三方库的兼容性。

PHP 自定义错误提示信息,核心在于控制 error_reporting、display_errors 和 log_errors 的组合,并配合 set_error_handler() 拦截非致命错误。直接修改 php.ini 或 .htaccess 只能开关默认行为,真要“自定义提示内容”,必须用 set_error_handler()。
用 set_error_handler() 捕获 E_WARNING、E_NOTICE 等非致命错误
PHP 默认不把 E_WARNING 当异常抛出,try/catch 捕不到。必须注册自定义处理器:
set_error_handler(function($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
return; // 遵守当前 error_reporting 级别
}
// 自定义格式,比如加时间戳和上下文
$log = sprintf("[%s] %s in %s on line %d\n", date('Y-m-d H:i:s'), $message, $file, $line);
error_log($log, 3, '/var/log/php-custom.log');
// 开发环境可 echo,生产环境禁用
if (defined('DEBUG') && DEBUG) {
echo "<div style="color:red;font-family:monospace;">⚠ {$message}</div>";
}
});
- 该函数只处理
E_WARNING、E_NOTICE、E_USER_*等,不处理E_ERROR(如语法错误、致命错误) - 必须在错误发生前调用,且不能在
eval()内部注册 - 返回
false会触发 PHP 默认错误处理(可选回退)
用 trigger_error() 主动抛出自定义提示
当业务逻辑需要主动报错(比如参数校验失败),用 trigger_error() 比 throw new Exception() 更轻量,且能被 set_error_handler() 统一捕获:
function divide($a, $b) {
if ($b == 0) {
trigger_error('除数不能为零', E_USER_WARNING);
return false;
}
return $a / $b;
}
-
E_USER_NOTICE:提示性信息,不影响流程 -
E_USER_WARNING:警告,建议修正但程序可继续 -
E_USER_ERROR:等效于E_ERROR,会终止脚本(慎用) - 注意:
trigger_error()不会进入catch块,除非你用set_exception_handler()+ErrorException包装
关闭默认错误显示,避免敏感信息泄露
线上环境必须关掉 display_errors,否则数据库密码、路径、变量值可能直接打到页面上:
- php.ini 中设
display_errors = Off,log_errors = On,error_log = /var/log/php-error.log - 运行时临时关闭:
ini_set('display_errors', '0');(需在任何错误发生前执行) - Apache .htaccess 中写:
php_flag display_errors off(仅限 Apache + mod_php) - CLI 模式下默认不显示,但可通过
ini_set('display_errors', '1')打开调试
真正难的不是写 handler,而是区分哪些错误该拦截、哪些该透出、哪些该转成异常、哪些该静默丢弃——尤其是涉及第三方库或框架时,set_error_handler() 可能干扰其原有错误机制,上线前务必验证兼容性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











