当前位置: 首页 > 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.rkmt.cn/news/1481420.html

相关文章:

  • Qt原生方案:千万行文本不卡顿,后台读取+视口按需渲染表格
  • LaserGRBL:如何实现激光雕刻控制的256级精度与实时优化?
  • 汽车方向盘控制改装:电阻分压原理与万能控制器实战指南
  • 2026徐州黄金回收踩过坑才敢说:认准这5家透明报价的口碑好店 - 商业快讯早知道
  • ComfyUI ControlNet预处理器技术架构深度解析:从图像特征提取到AI生成控制
  • 2026 年广州财税服务商权威测评:TOP3 实力机构深度解析与选型指南 - 互联网科技品牌测评
  • 终极指南:如何使用AKShare快速获取全面财经数据
  • 海口奢侈品首饰回收排名:添价收首饰回收稳居奢侈品回收行业天花板 - 薛定谔的梨花猫
  • 从《视若无睹》到代码世界:聊聊程序员如何避免“选择性失明”的沟通陷阱
  • 数理逻辑笔记
  • m4s-converter:释放B站缓存视频的跨平台转换利器
  • 3分钟搞定专业直播背景:OBS背景移除插件完全指南
  • 安翔智能包装设备
  • Unity游戏模组加载神器:MelonLoader终极使用指南
  • d2s-editor:可视化暗黑破坏神2存档编辑工具,让游戏修改变得简单高效
  • 构建现代Web应用的权限控制:为什么你需要mini-rbac
  • CSDN AI数字营销生效延迟真相:不是系统问题,而是这4类内容未过“AI语义可信度”校验
  • 从流量衰减到爆款复刻:用CSDN AI数字营销数据逆向推演选题ROI的3步归因法
  • 跨平台笔记迁移实战指南:一站式自动化解决方案
  • 【Linux】网络基础(1)--之局域网、广域网、OSI,网络协议、TCP/IP结构模型、网络传输等知识详解
  • WHY-GEO优化全栈运营系统 | 2026年AI搜索优化(GEO)平台选型指南:技术、资源与服务全维度评估 - GrowthUME
  • 3步解锁你的加密音乐:浏览器本地解密完全指南
  • Profibus主站选型指南:PLC、PC与专用板卡方案深度解析
  • Jsxer解密:5步破解Adobe ExtendScript二进制加密,让JSXBIN文件重见天日
  • 磁翻板液位计优质厂家TOP10 - 液体流量液位品牌推荐
  • 2026上海黄金回收哪里价更高?对比5家店后,这份榜单告诉你答案 - 商业快讯早知道
  • 2026想在上海市黄金回收多卖几百块?这5家口碑好店,报价确实更实在 - 商业快讯早知道
  • Montserrat字体:免费开源字体解决方案的终极指南
  • 智能驾驶的“安全气囊”:失效保护技术全景解读与实战指南
  • HS2-HF Patch终极指南:一键解决Honey Select 2兼容性问题