PHP 具有与其他编程语言类似的异常模型。异常是描述 PHP 脚本的错误或意外行为的对象。许多 PHP 函数和类都会引发异常。用户定义的函数和类也可以抛出异常。当函数遇到无法使用的数据时,异常是停止函数的好方法。

抛出异常

throw关键字用于抛出异常。当抛出异常时,其后面的代码将不会被执行。

请注意,如果未捕获异常,则会发生致命错误,并显示"Uncaught Exception"消息。

考虑下面的示例,其中使用 throw 关键字抛出异常

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

echo divide(25, 0);
?> 

上述代码的输出将类似于:

PHP Fatal error:  Uncaught Exception: Division by zero in Main.php:4
Stack trace:
#0 Main.php(9): divide()
#1 {main}
  thrown in Main.php on line 4 

try-catch 块

为了避免上述情况,try-catch 代码块。 try关键字用于测试语句块是否有错误,catch关键字用于定义当错误发生时执行并处理错误的语句块。使用 try-catch 块的语法如下:

语法

try{
  statements;
} catch (Exception $e) {
  statements;
} 

考虑下面的示例,其中 try-catch 代码块用于处理异常。

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

try {
  echo divide(25, 0);
} catch(Exception $e) {
  echo "Division by zero is invalid.";
}
?> 

在上面的例子中,异常类型为Exception,变量名为$e.上述代码的输出将是:

Division by zero is invalid. 

The finally 块

finally 关键字用于定义语句块无论 try-catch 块结果如何,它都会执行。它有助于程序在继续操作之前关闭文件。

语法

try{
  statements;
} catch (Exception $e) {
  statements;
} finally {
  statements;
} 

在下面的示例中,使用了 finally 代码块,该代码块在之后执行try-catch 代码块。

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

try {
  echo divide(25, 0);
} catch(Exception $e) {
  echo "Division by zero is invalid.\n";
} finally {
  echo "try-catch block finished.\n";
}
?> 

上述代码的输出将是:

Division by zero is invalid.
try-catch block finished. 

异常类

Exception是所有用户异常的基类。 Exception 对象包含有关函数遇到的错误或意外行为的信息。可以使用以下语法创建Exception对象:

语法

public __construct(message, code, previous) 

参数

message可选。 指定要抛出的异常消息。
code可选。 指定异常代码。
previous可选。 指定用于异常链接的前一个异常。

方法

异常类提供以下方法:

方法描述
getMessage()获取异常消息
getPrevious()返回上一个 Throwable
getCode()获取异常代码
getFile()获取创建异常的文件
getLine()获取行异常被创建
getTrace()获取堆栈跟踪
getTraceAsString()以字符串形式获取堆栈跟踪
__toString() 异常的字符串表示形式

考虑下面的示例,其中 使用了异常类方法。

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

try {
  echo divide(25, 0);
} catch(Exception $e) {
  $code = $e->getCode();
  $message = $e->getMessage();
  $file = $e->getFile();
  $line = $e->getLine();
  echo "Exception thrown in $file on line $line: [Code $code]
  $message";
}
?> 

上述代码的输出将是:

Exception thrown in Main.php on line 4: [Code 3]
  Division by zero