在基于 PHP 的项目中,你会采用怎样的设计方案来构建全局的异常处理与错误处理机制?
考察说明
考查对 PHP 错误与异常处理机制的理解及工程化落地能力
回答思路
- 【回答框架 1】PHP 中错误与异常是两套体系:错误由 error_reporting 与错误处理器接管,异常通过 try/catch 与异常处理器接管;需先区分二者,再统一收敛到全局入口。
- 【回答框架 2】全局错误处理通过 set_error_handler 注册回调,将 E_ALL 级别的错误转为 ErrorException 抛出,再交由统一异常管道处理;同时用 register_shutdown_function 捕获 fatal error,避免遗漏。
- 【回答框架 3】全局异常处理通过 set_exception_handler 注册处理函数,将未捕获异常统一记录日志、返回友好响应;框架或业务代码可自定义异常基类,区分业务异常与系统异常,分别处理。
- 【回答框架 4】生产环境需关闭 display_errors,开启 log_errors,将日志写入指定文件或对接日志系统;开发环境可保留展示便于调试,通过环境变量控制配置差异。
- 【回答框架 5】日志应包含时间、级别、消息、堆栈、URI、请求参数等上下文;风险点在于异常处理函数自身需避免二次抛错,且要防止敏感信息泄露。
- 【关键点 1】set_error_handler 可将错误转为异常,统一处理
- 【关键点 2】set_exception_handler 负责捕获未处理异常
- 【关键点 3】生产环境关闭 display_errors、开启 log_errors
- 【关键点 4】用 register_shutdown_function 兜底致命错误
- 【关键点 5】日志需包含堆栈与请求上下文
- 【易错点 1】异常处理函数内再次抛异常或输出错误,导致递归或响应输出失败
- 【易错点 2】将错误处理与异常处理混用,未区分 PHP 7 前后 Error 与 Exception 的继承差异
- 【易错点 3】在生产环境保留 display_errors,暴露路径与 SQL 等敏感信息