本文目录导读:

我来详细介绍一下PHP中的异常检测和处理机制。
基础异常处理
try-catch 结构
try {
// 可能抛出异常的代码
$result = 10 / 0; // 除零错误
} catch (DivisionByZeroError $e) {
echo "除数不能为零: " . $e->getMessage();
} catch (Exception $e) {
echo "其他错误: " . $e->getMessage();
}
自定义异常类
class CustomException extends Exception {
public function errorMessage() {
return "自定义错误: " . $this->getMessage();
}
}
try {
throw new CustomException("这是一个自定义异常");
} catch (CustomException $e) {
echo $e->errorMessage();
}
全局异常处理
设置全局异常处理器
function exceptionHandler($exception) {
echo "未捕获的异常: " . $exception->getMessage();
// 可以记录日志
error_log("异常: " . $exception->getMessage());
}
set_exception_handler('exceptionHandler');
错误与异常的转换
将错误转为异常
function errorToException($severity, $message, $file, $line) {
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler('errorToException');
try {
// 触发一个警告
echo $undefinedVariable;
} catch (ErrorException $e) {
echo "捕获到错误: " . $e->getMessage();
}
高级异常检测模式
多个catch块
try {
// 执行可能出错的代码
$file = fopen("nonexistent.txt", "r");
if (!$file) {
throw new Exception("文件打不开");
}
} catch (FileNotFoundException $e) {
echo "文件不存在";
} catch (PermissionException $e) {
echo "权限不足";
} catch (Exception $e) {
echo "通用错误: " . $e->getMessage();
}
finally 块
try {
$db = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
// 数据库操作
} catch (PDOException $e) {
echo "数据库错误: " . $e->getMessage();
} finally {
// 无论是否发生异常都会执行
$db = null; // 关闭连接
}
异常检测实用方法
检查异常类型
try {
$value = someFunction();
if ($value === false) {
throw new InvalidArgumentException("返回值无效");
}
} catch (Exception $e) {
if ($e instanceof InvalidArgumentException) {
echo "参数错误";
} elseif ($e instanceof RuntimeException) {
echo "运行时错误";
}
}
日志记录异常
try {
// 业务逻辑
} catch (Exception $e) {
$logMessage = sprintf(
"[%s] %s in %s:%s\n",
date('Y-m-d H:i:s'),
$e->getMessage(),
$e->getFile(),
$e->getLine()
);
file_put_contents('error.log', $logMessage, FILE_APPEND);
echo "系统错误,请稍后重试";
}
最佳实践
<?php
// 1. 设置错误报告级别
error_reporting(E_ALL);
ini_set('display_errors', 0); // 生产环境关闭显示
// 2. 自定义异常处理类
class ExceptionHandler {
public static function handle($exception) {
// 记录日志
self::logException($exception);
// 返回友好的错误信息
http_response_code(500);
echo json_encode([
'error' => true,
'message' => '系统内部错误'
]);
}
private static function logException($exception) {
$log = sprintf(
"[%s] %s\nFile: %s\nLine: %d\nTrace:\n%s\n\n",
date('Y-m-d H:i:s'),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine(),
$exception->getTraceAsString()
);
error_log($log, 3, 'logs/exceptions.log');
}
}
// 3. 注册异常处理
set_exception_handler(['ExceptionHandler', 'handle']);
检查异常的关键方法
// 获取异常信息
$e->getMessage(); // 异常消息
$e->getCode(); // 异常代码
$e->getFile(); // 发生异常的文件
$e->getLine(); // 发生异常的行号
$e->getTrace(); // 堆栈跟踪(数组)
$e->getTraceAsString(); // 堆栈跟踪(字符串)
$e->getPrevious(); // 前一个异常(用于异常链)
// 异常链
try {
try {
throw new Exception("内部异常");
} catch (Exception $e) {
throw new Exception("外部异常", 0, $e);
}
} catch (Exception $e) {
echo $e->getMessage(); // 外部异常
echo $e->getPrevious()->getMessage(); // 内部异常
}
PHP 异常检测的核心要点:
- 使用 try-catch 处理可预见的异常
- 使用全局异常处理器捕获未处理异常
- 合理使用 finally 块清理资源
- 记录异常日志便于调试
- 向用户返回友好的错误信息
- 避免在异常中暴露敏感信息
合理的异常处理能提高代码的健壮性和可维护性。