本文目录导读:

我来详细介绍一下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 块清理资源
- 记录异常日志便于调试
- 向用户返回友好的错误信息
- 避免在异常中暴露敏感信息
合理的异常处理能提高代码的健壮性和可维护性。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播