本文目录导读:

在PHP中统一管理错误码,我建议采用以下几种成熟方案:
常量定义法(最基础)
<?php
// error_codes.php
class ErrorCode {
// 通用错误码 (1xxx)
const SUCCESS = 0;
const PARAM_ERROR = 1001;
const AUTH_FAILED = 1002;
const NOT_FOUND = 1003;
const FORBIDDEN = 1004;
const SYSTEM_ERROR = 1005;
// 业务错误码 (2xxx)
const USER_NOT_EXIST = 2001;
const USER_PASSWORD_ERROR = 2002;
const USER_DUPLICATE = 2003;
// 其他平台错误码 (3xxx)
const SMS_SEND_FAILED = 3001;
const EMAIL_SEND_FAILED = 3002;
// 错误消息映射
public static $messages = [
self::SUCCESS => '操作成功',
self::PARAM_ERROR => '参数错误',
self::AUTH_FAILED => '认证失败',
self::NOT_FOUND => '资源不存在',
self::FORBIDDEN => '没有权限',
self::SYSTEM_ERROR => '系统错误',
self::USER_NOT_EXIST => '用户不存在',
self::USER_PASSWORD_ERROR => '密码错误',
self::USER_DUPLICATE => '用户已存在',
self::SMS_SEND_FAILED => '短信发送失败',
self::EMAIL_SEND_FAILED => '邮件发送失败',
];
// 获取错误消息
public static function getMessage($code) {
return self::$messages[$code] ?? '未知错误';
}
}
?>
异常类封装法(推荐)
<?php
// exceptions/BusinessException.php
class BusinessException extends Exception {
private $errorCode;
private $errorData;
public function __construct($errorCode, $message = '', $errorData = [], Exception $previous = null) {
$this->errorCode = $errorCode;
$this->errorData = $errorData;
// 如果没传message,自动从配置获取
if (empty($message)) {
$message = ErrorCode::getMessage($errorCode);
}
parent::__construct($message, $errorCode, $previous);
}
public function getErrorCode() { return $this->errorCode; }
public function getErrorData() { return $this->errorData; }
}
// 子类扩展
class UserException extends BusinessException {
public static function notFound() {
return new self(ErrorCode::USER_NOT_EXIST);
}
public static function passwordError() {
return new self(ErrorCode::USER_PASSWORD_ERROR);
}
}
?>
配置文件方式(适合多环境)
<?php
// config/error_codes.php
return [
'LOCAL' => [
'success' => 0,
'param_error' => 1001,
'auth_failed' => 1002,
],
'PRODUCTION' => [
'success' => 0,
'param_error' => 40001,
'auth_failed' => 40002,
],
];
// ErrorCodeService.php
class ErrorCodeService {
private $errorCodes;
public function __construct($env = 'LOCAL') {
$this->errorCodes = require 'config/error_codes.php';
$this->errorCodes = $this->errorCodes[$env];
}
public function getCode($key) {
return $this->errorCodes[$key] ?? 99999;
}
}
?>
全局异常处理器
<?php
// global_exception_handler.php
class GlobalExceptionHandler {
public static function register() {
set_exception_handler([self::class, 'handleException']);
set_error_handler([self::class, 'handleError']);
register_shutdown_function([self::class, 'handleFatalError']);
}
public static function handleException($e) {
$response = [
'code' => $e instanceof BusinessException ? $e->getErrorCode() : 500,
'message' => $e->getMessage(),
'data' => $e instanceof BusinessException ? $e->getErrorData() : null
];
// 记录日志
Log::error('系统异常', [
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'code' => $e->getCode()
]);
// 根据环境决定是否显示详细错误
if (ENV !== 'development') {
$response['message'] = '系统错误,请稍后重试';
}
echo json_encode($response);
exit;
}
public static function handleError($errno, $errstr, $errfile, $errline) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
public static function handleFatalError() {
$error = error_get_last();
if ($error !== null) {
$e = new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line']);
self::handleException($e);
}
}
}
// 注册全局异常处理
GlobalExceptionHandler::register();
?>
完整示例:统一响应格式
<?php
// ApiResponse.php
class ApiResponse {
private $code;
private $message;
private $data;
public function __construct($code = 0, $data = [], $message = '') {
$this->code = $code;
$this->data = $data;
$this->message = $message ?: ErrorCode::getMessage($code);
}
public static function success($data = []) {
return new self(ErrorCode::SUCCESS, $data);
}
public static function error($code, $message = '', $data = []) {
return new self($code, $data, $message);
}
public function toJson() {
// 记录API日志
Log::info('API响应', [
'code' => $this->code,
'message' => $this->message,
'data' => $this->data
]);
return json_encode([
'code' => $this->code,
'message' => $this->message,
'data' => $this->data
]);
}
}
// 使用示例
try {
$user = $userService->getUser($userId);
echo ApiResponse::success(['user' => $user])->toJson();
} catch (BusinessException $e) {
echo ApiResponse::error($e->getErrorCode(), $e->getMessage(), $e->getErrorData())->toJson();
} catch (Exception $e) {
// 记录严重错误
Log::error('未捕获异常', ['exception' => $e]);
echo ApiResponse::error(ErrorCode::SYSTEM_ERROR)->toJson();
}
?>
错误码管理工具类
<?php
// ErrorCodeManager.php
class ErrorCodeManager {
private static $instance = null;
private $errorCodes = [];
private $configPath = 'config/error_codes.php';
private function __construct() {
$this->loadErrorCodes();
}
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function loadErrorCodes() {
$this->errorCodes = require $this->configPath;
}
public function getMessage($code) {
return $this->errorCodes['messages'][$code] ?? '未知错误';
}
public function getCode($key) {
return $this->errorCodes['codes'][$key] ?? 99999;
}
public static function translate($code) {
return self::getInstance()->getMessage($code);
}
}
// 静态调用封装
if (!function_exists('error_message')) {
function error_message($code) {
return ErrorCodeManager::translate($code);
}
}
if (!function_exists('error_code')) {
function error_code($key) {
return ErrorCodeManager::getInstance()->getCode($key);
}
}
?>
最佳实践建议:
- 统一规范:错误码按模块分段,如1xxx通用、2xxx用户、3xxx订单等
- 文档化:维护错误码文档,包含含义和处理建议
- 日志记录:记录错误发生时的上下文
- 多语言支持:错误消息支持多语言
- 监控报警:对重要错误码设置监控
这些方案可以根据你的项目复杂度选择使用,中小型项目推荐使用异常类封装法,大型项目可以配置文件和异常类结合使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播