PHP – 异常


在版本 7 之前,PHP 解析器过去常常报告错误以响应各种条件。每个错误过去都属于特定的预定义类型。PHP7 更改了错误报告的机制。现在,大多数错误都是通过引发错误异常来报告的,而不是传统的错误报告。

PHP 异常处理机制与许多其他语言类似,使用 trycatchthrow 和 finally 关键字实现。

Throwable 接口

PHP 异常实现了 Throwable 接口。Throwable 接口充当可通过 throw 语句引发的任何对象的基础,包括 Error Exception 对象。

用户定义的类不能直接实现 Throwable 接口。相反,要声明用户定义的异常类,它必须扩展 Exception 类。

具有潜在异常的 PHP 代码括在 try 块中。如果找到异常对象,则会引发该对象,以便于捕获潜在的异常。每个 try 必须至少有一个对应的 catch 或 finally 块。此外,可能有多个 catch/finally 块对应于 try 块。


try { 

   // 在try块中抛出错误
   // 如果发生错误,我们可以抛出异常
   throw new Exception('这是一个错误。'); 
}
catch(Exception $e) { 

   // 在catch-block 接住 catch 
   // 对exception对象做点什么,例如。
   // 显示其消息
   echo '错误消息: ' .$e->getMessage(); 
}

如果引发异常并且没有 catch 块,则异常将“冒泡”,直到找到匹配的 catch 块。如果调用堆栈一直展开到全局范围,而没有遇到匹配的 catch 块,则将调用全局异常处理程序(如果已设置),否则程序将终止并出现致命错误。

set_exception_handler

如果未在 try/catch 块中捕获异常,则此函数设置默认异常处理程序。回调执行后,程序执行将停止。


 set_exception_handler(?callable $callback): ?callable

$callback 参数是发生未捕获的异常时要调用的函数的名称。此函数必须在调用 set_exception_handler() 之前定义。此处理程序函数需要接受一个参数,该参数将是引发的异常对象。

该函数返回以前定义的异常处理程序的名称,或在出错时返回 NULL。如果未定义以前的处理程序,则还会返回 NULL

例子

请看下面的例子 -


<?php
   function handler($ex) {
      echo "未捕获的异常是: " , $ex->getMessage(), "\n";
   }

   set_exception_handler('handler');
   throw new Exception('未找到异常');
   echo "不包括已执行\n";
?>

它将产生以下输出 -

未捕获的异常是:未找到异常

SPL 异常

标准 PHP 库包含预定义的异常 -

预定义异常 描述
LogicException 表示程序逻辑中的错误的 Exception。
BadFunctionCallException 如果回调引用未定义的函数或缺少某些参数,则引发异常。
BadMethodCallException 如果回调引用未定义的方法或缺少某些参数,则引发异常。
DomainException 如果值不符合定义的有效数据域,则引发异常。
InvalidArgumentException 如果参数不是预期类型,则引发异常。
LengthException 如果长度无效,则引发异常。
OutOfRangeException 请求非法索引时引发异常。
RuntimeException 如果发生只能在运行时发现的错误,则引发异常。
OutOfBoundsException 如果值不是有效键,则引发异常。
OverflowException 将元素添加到完整容器时引发异常。
RangeException 引发异常以指示程序执行期间的范围错误。不是 under/overflow 的算术错误。
UnderflowException 对空容器执行无效操作(如删除元素)时引发异常。
UnexpectedValueException 如果值与一组值不匹配,则引发异常。

用户定义的异常

您可以定义扩展基 Exception 类的自定义异常类。以下脚本定义了一个名为 myException 的自定义异常类。如果 $num 的值小于 0 或大于 100,则会引发此类异常。

例子

Exception 类的 getMessage() 方法返回错误消息,getLine() 方法返回出现异常的代码行。


<?php
   class myException extends Exception {
      function message() {
         return "错误 : ". $this->getMessage(). " 在行号:". $this->getLine();
      }
   }
   $num=125;
   try {
      if ($num>100 || $num<0)
      throw new myException("$num 是无效数字");
      else
      echo "$num 是有效数字";
   }
   catch (myException $m) {
      echo $m->message();
   }
?>

使用 $num=125  $num=90 运行上述代码,以获取错误消息和有效数字的消息 -

错误 : 125 是无效数字 在行号:10