当前位置: 首页 > news >正文

PHP错误页面与异常显示

PHP错误页面与异常显示

错误页面的设计影响用户体验。开发环境显示详细错误信息,生产环境显示友好的错误页面。今天说说PHP错误页面的处理。

开发环境的错误显示。

```php
ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL);
?>

生产环境的错误处理。

```php
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');

set_exception_handler(function (Throwable $e) {
error_log("未捕获: {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}");

http_response_code(500);
header('Content-Type: application/json; charset=utf-8');

$response = [
'error' => true,
'message' => '服务器内部错误',
];

if ($_SERVER['APP_ENV'] === 'development') {
$response['message'] = $e->getMessage();
$response['file'] = $e->getFile();
$response['line'] = $e->getLine();
}

echo json_encode($response, JSON_UNESCAPED_UNICODE);
});

set_error_handler(function (int $level, string $message, string $file, int $line) {
throw new ErrorException($message, 0, $level, $file, $line);
});
?>

自定义错误页面。

```php
class ErrorPage
{
public static function show(int $code, string $message = ''): void
{
http_response_code($code);
$title = self::getTitle($code);
$message = $message ?: self::getDefaultMessage($code);

echo "

{$title}

{$code}

{$title}

{$message}

";
exit;
}

private static function getTitle(int $code): string
{
return match ($code) {
400 => '错误请求',
401 => '未授权',
403 => '禁止访问',
404 => '页面不存在',
405 => '方法不允许',
429 => '请求过多',
500 => '服务器错误',
502 => '网关错误',
503 => '服务不可用',
default => '错误',
};
}

private static function getDefaultMessage(int $code): string
{
return match ($code) {
404 => '您访问的页面不存在',
500 => '服务器遇到错误,请稍后重试',
503 => '服务正在维护,请稍后访问',
default => '请求处理出错',
};
}
}

// ErrorPage::show(404);
?>

保存错误信息到日志。

```php
class ErrorLogger
{
private string $logDir;
private string $env;

public function __construct(string $logDir = '/var/log/app', string $env = 'production')
{
$this->logDir = rtrim($logDir, '/');
$this->env = $env;
if (!is_dir($this->logDir)) mkdir($this->logDir, 0755, true);
}

public function log(Throwable $e, array $context = []): void
{
$entry = [
'time' => date('c'),
'env' => $this->env,
'type' => get_class($e),
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
'context' => $context,
];

file_put_contents(
$this->logDir . '/errors-' . date('Y-m-d') . '.log',
json_encode($entry, JSON_UNESCAPED_UNICODE) . "\n",
FILE_APPEND | LOCK_EX
);
}
}
?>

好的错误处理提升用户体验。开发环境显示详细错误帮助调试,生产环境隐藏错误细节保护安全。统一的错误页面让用户看到友好的提示,而不是难看的错误堆栈。

http://www.jsqmd.com/news/969689/

相关文章:

  • 信号传输的隐形战场:序章.信号传输的隐形战场
  • 2026徐州黄金回收踩过坑才敢说:认准这5家透明报价的口碑好店 - 商业快讯早知道
  • 海口奢侈品首饰回收排名:添价收首饰回收稳居奢侈品回收行业天花板 - 薛定谔的梨花猫
  • 2026 年广州财税服务商权威测评:TOP3 实力机构深度解析与选型指南 - 互联网科技品牌测评
  • ComfyUI ControlNet预处理器技术架构深度解析:从图像特征提取到AI生成控制
  • 从《视若无睹》到代码世界:聊聊程序员如何避免“选择性失明”的沟通陷阱
  • 百度地图离线瓦片下载器:支持18级缩放、PNG/JPG双格式导出与TMS标准目录生成
  • 终极指南:如何使用AKShare快速获取全面财经数据
  • JSXBIN解码器终极指南:3步快速反编译Adobe脚本二进制文件
  • 广州空调移机哪家靠谱?专业流程+正规资质一个都不能少 - 生活服务
  • 从‘A’到‘ÿ’:ASCII码的前世今生与那些被遗忘的控制字符(含实用场景解析)
  • 数理逻辑笔记
  • m4s-converter:释放B站缓存视频的跨平台转换利器
  • 2026年6月洗车设备销售厂家推荐,三轴洗车设备/全自动电脑洗车设备/无接触全自动洗车设备,洗车设备品牌如何选 - 品牌推荐师
  • RAG工程化落地:从PDF解析到生成约束的全链路实践
  • 安翔智能包装设备
  • 3分钟搞定专业直播背景:OBS背景移除插件完全指南
  • IronyModManager深度解析:如何彻底解决Paradox游戏模组冲突的技术实现
  • 你的富集结果图够‘高级’吗?用clusterProfiler和ggplot2定制化可视化实战
  • PCB拼版邮票孔设计:从原理到实战的完整指南
  • Unity游戏模组加载神器:MelonLoader终极使用指南
  • d2s-editor:可视化暗黑破坏神2存档编辑工具,让游戏修改变得简单高效
  • 深度解析JSXBIN二进制格式逆向工程实现原理:Jsxer高效反编译器架构剖析
  • 2026年6月手套箱源头厂家哪家权威,单工位手套箱/厌氧手套箱/锂电手套箱/双工位手套箱,手套箱源头厂商哪家好 - 品牌推荐师
  • CSDN AI数字营销生效延迟真相:不是系统问题,而是这4类内容未过“AI语义可信度”校验
  • 构建现代Web应用的权限控制:为什么你需要mini-rbac
  • MATLAB生成FFT旋转因子:定点化实现与FPGA/嵌入式应用指南
  • 从协议到代码:如何用C语言解析5G FAPI P7接口中的UCI.indication消息?
  • 番茄小说下载器完整指南:5个核心功能让你轻松收藏所有小说
  • LabVIEW与PLC通讯方案全解析:从OPC、DSC到协议驱动的实战选型指南