PHP 异常

什么是异常?

异常是一个描述 PHP 脚本错误或意外行为的对象。

许多 PHP 函数和类都会抛出异常。

用户定义的函数和类也可以抛出异常。

当函数遇到它无法使用的数据时,异常是一个很好的停止函数的方法。

抛出异常

throw 语句允许用户定义的函数或方法抛出异常。当异常被抛出时,其后面的代码将不会被执行。

如果异常没有被捕获,将会出现带有 "Uncaught Exception" 消息的致命错误。

让我们尝试抛出一个没有捕获的异常:

实例

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

echo divide(5, 0);
?>

亲自试一试

结果将类似于以下内容:

Fatal error: Uncaught Exception: Division by zero in C:\webfolder\test.php:4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4

try...catch 语句

为了避免上面的示例中出现的错误,我们可以使用 try...catch 语句来捕获异常并继续处理。

语法

try {
  可能抛出异常的代码
} catch(Exception $e) {
  当捕获到异常时运行的代码
}

实例

当抛出异常时显示一条消息:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $e) {
  echo "无法进行除法运算。";
}
?>

亲自试一试

catch 块指示应该捕获哪种类型的异常以及用于访问异常的变量名称。在上面的例子中,异常的类型是 Exception,变量名称是 $e

try...catch...finally 语句

try...catch...finally 语句可以用于捕获异常。finally 块中的代码无论是否捕获到异常都会运行。如果 finally 存在,catch 块是可选的。

语法

try {
  可能抛出异常的代码
} catch(Exception $e) {
  当捕获到异常时运行的代码
} finally {
  无论是否捕获到异常都会运行的代码
}

实例

当抛出异常时显示一条消息,然后指示过程已完成:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $e) {
  echo "无法进行除法运算。";
} finally {
  echo "过程已完成。";
}
?>

亲自试一试

实例

即使未捕获到异常也输出一个字符串:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} finally {
  echo "过程已完成。";
}
?>

亲自试一试

异常对象

异常对象包含有关函数遇到的错误或意外行为的信息。

语法

new Exception(message, code, previous)

参数值

参数 描述
message 可选。描述为何抛出异常的字符串。
code 可选。整数,可用于轻松区分同一类型的不同异常。
previous 可选。如果此异常是在另一个异常的 catch 块中抛出的,建议将此异常传递给此参数。

方法

当捕获异常时,下表显示了一些可用于获取有关异常信息的方法:

方法 描述
getMessage() 返回描述为何抛出异常的字符串。
getPrevious() 如果此异常是由另一个异常触发的,此方法返回前一个异常。如果不是,则返回 null。
getCode() 返回异常代码。
getFile() 返回抛出异常的文件的完整路径。
getLine() 返回抛出异常的代码行的行号。

实例

输出有关抛出的异常的信息:

<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero", 1);
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $ex) {
  $code = $ex->getCode();
  $message = $ex->getMessage();
  $file = $ex->getFile();
  $line = $ex->getLine();
  echo "在文件 $file 的第 $line 行抛出了异常:[代码 $code] \n$message";
}
?>

亲自试一试

完整的异常参考手册

如需获取完整的参考,请访问我们完整的 PHP 异常参考手册

该参考手册包含所有异常方法的描述和实例。