Php 简明教程

PHP – Exceptions

在 7 之前的版本中,PHP 解析器在响应各种条件时曾经报告错误。每个错误曾经都是一个预定义类型。PHP7 已经更改了错误报告的机制。与传统的错误报告不同,现在大多数错误都是通过抛出错误异常来报告的。

PHP 中的异常处理机制与许多其他语言类似,并且使用 try, catch, throwfinally 关键字实现。

The Throwable Interface

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

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

带有潜在异常的 PHP 代码被 try 块包围。如果找到异常对象,则抛出该对象,以方便捕获潜在的异常。每个 try 必须至少有一个对应的 catchfinally 块。此外,对应于 try 块可能有多个 catch/finally 块。

try {

   // throw errors in the try-block
   // if an error occurs we can throw an exception
   throw new Exception('this is an error.');
}
catch(Exception $e) {

   // catch the throws in the catch-block
   // do something with the exception object, eg.
   // display its message
   echo 'Error message: ' .$e->getMessage();
}

如果抛出了异常并且没有 catch 块,那么异常会“冒泡”出现,直到找到一个匹配的 catch 块。如果调用堆栈一直向下绕回到全局范围而没有遇到一个匹配的 catch 块,那么将调用一个全局异常处理程序(如果已设置),否则程序将以一个致命错误终止。

set_exception_handler

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

set_exception_handler(?callable $callback): ?callable

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

此函数将返回以前定义的异常处理程序的名称,或者在出错时返回 NULL。如果之前没有定义处理程序,那么也将返回 NULL。

Example

请看以下示例:

<?php
   function handler($ex) {
      echo "Uncaught exception is : " , $ex->getMessage(), "\n";
   }

   set_exception_handler('handler');
   throw new Exception('Not Found Exception');
   echo "not included Executed\n";
?>

它将生成以下 output

Uncaught exception is : Not Found Exception

SPL Exceptions

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

Sr.No

Predefined Exceptions

1

LogicException 表示程序逻辑中错误的异常。

2

BadFunctionCallException 如果回调函数引用了一个未定义的函数或者缺少一些参数则抛出的异常。

3

BadMethodCallException 如果回调函数引用了一个未定义的方法或者缺少一些参数则抛出的异常。

4

DomainException 如果一个值不遵守一个定义的有效数据域则抛出的异常。

5

InvalidArgumentException 如果一个参数不是期望的类型而抛出的异常。

6

LengthException 如果长度无效则抛出的异常。

7

OutOfRangeException 如果请求了一个非法索引则抛出的异常。

8

RuntimeException 如果出现了一个只可在运行时发现的错误而抛出的异常。

9

OutOfBoundsException 如果一个值不是一个有效键值则抛出的异常。

10

OverflowException 当向一个完整的容器中添加元素时抛出的异常。

11

RangeException 在程序执行期间向外抛出异常,用于指示范围错误。非上下溢出式的算术错误。

12

UnderflowException 当对空容器执行无效操作时向外抛出异常,例如,移除元素时。

13

如果值与一组值不符时,将会抛出异常。

User-defined Exception

你可以定义一个扩展了基本 Exception 类的自定义异常类。下面的脚本定义了一个称为 myException 的自定义异常类。如果 $num 的值小于 0 或者大于 100,则会抛出此类型的异常。

Example

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

<?php
   class myException extends Exception {
      function message() {
         return "error : ". $this->getMessage(). "in line no". $this->getLine();
      }
   }
   $num=125;
   try {
      if ($num>100 || $num<0)
      throw new myException("$num is invalid number");
      else
      echo "$num is a valid number";
   }
   catch (myException $m) {
      echo $m->message();
   }
?>

使用 $num=125$num=90 运行上述代码,可获得一条错误消息和一条有效的数字消息 −

error : 125 is invalid number in line no 10