PHP 简明教程

PHP 异常处理

1. 什么是异常?

异常(Exception)是程序在运行过程中发生的非预期错误或行为。当发生异常时,程序的正常流程会被中断。

相比于传统的错误处理,异常机制允许开发者以更结构化的方式来处理错误。通过使用异常,您可以将错误处理逻辑从主要的业务逻辑中分离出来。

2. 抛出异常 - throw 关键字

在 PHP 中,使用 throw 语句可以手动触发一个异常。throw 语句通常用于验证输入或在检测到无法继续执行的情况时使用。

被抛出的必须是一个对象,通常是内置 Exception 类的一个实例。

代码示例:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("除数不能为零");
  }
  return $dividend / $divisor;
}
?>

3. Try...Catch 语句

为了避免抛出的异常导致脚本终止,我们必须使用 try...catch 块来捕获并处理它。

  • Try 块: 包含可能触发异常的代码。
  • Catch 块: 如果 try 块中发生了异常,代码执行将立即跳转到 catch 块中。

3.1 语法

try {
  // 运行可能发生异常的代码
} catch(Exception $e) {
  // 运行处理异常的代码
}

3.2 实战示例

代码示例:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("除数不能为零");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $e) {
  echo "无法计算结果。";
}
?>

4. Try...Catch...Finally 语句

finally 块可以跟在 catch 块之后,或者直接跟在 try 块之后(如果不打算捕获异常的话)。

无论是否抛出异常,也无论是否捕获了异常,finally 块中的代码始终会执行。这在释放资源(如关闭数据库连接或文件流)时非常有用。

代码示例:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("除数不能为零");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $e) {
  echo "捕获到异常: " . $e->getMessage();
} finally {
  echo "。流程已结束。";
}
?>

5. Exception 对象详解

Exception 对象包含了关于所发生错误的重要信息。通过调用该对象的方法,我们可以获取详细的上下文数据。

5.1 语法及构造函数

new Exception(message, code, previous)
参数描述
message可选。描述异常原因的字符串。
code可选。一个整数,可作为错误代码。
previous可选。如果异常是在另一个异常中抛出的,可以用此参数引用前一个异常。

5.2 常用方法列表

当捕获到异常时,可以使用以下方法获取详情:

  • getMessage() - 返回描述异常的消息字符串。
  • getPrevious() - 如果存在,返回上一个异常对象。
  • getCode() - 返回异常代码。
  • getFile() - 返回发生异常的文件全路径。
  • getLine() - 返回发生异常的代码行号。

代码示例:

<?php
try {
  throw new Exception("发生了一些错误", 404);
} catch(Exception $e) {
  echo "消息: " . $e->getMessage() . "<br>";
  echo "代码: " . $e->getCode() . "<br>";
  echo "文件: " . $e->getFile() . "<br>";
  echo "行号: " . $e->getLine();
}
?>