PHP – 异常



在 7.0 版本之前,PHP 解析器用于在响应各种条件时报告错误。每个错误都属于某种预定义类型。PHP7 改变了错误报告机制。大多数错误现在通过抛出异常来报告,而不是传统的错误报告。

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

Throwable 接口

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

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

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

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。

示例

查看以下示例:

<?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";
?>

它将产生以下输出

Uncaught exception is : Not Found Exception

SPL 异常

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

序号 预定义异常
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

UnexpectedValueException

如果值与一组值不匹配,则抛出此异常。

用户定义的异常

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

示例

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
广告