PHP 7 中 Error 和 ErrorException 的区别

Difference between Error and ErrorException in PHP 7

在 PHP 7 的文档中,我注意到两个预定义的异常 Error and ErrorException 几乎完全相同,ErrorException 具有额外的 $severity 属性 和 Error 仅在 PHP 7 中引入,而 ErrorException 自 PHP 5.1 以来就存在。

据我所知,Error 是我应该用来捕获所有内部 PHP 错误(例如类型错误)的异常,但我不明白它的目的是什么ErrorException 异常。它们各自有什么用,我应该根据它们中的任何一个来创建自定义异常,还是应该坚持使用通常的 Exception?

你可以从这个page which describes errors in php

中看出Errorclass的目的

PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.

相同的描述在其自身 Error 页面上:

Error is the base class for all internal PHP errors.

因此您不应该将此 class 用于您的用户定义的异常。

ErrorException you can get from this good SO question/answers的目的:

ErrorException is mostly used to convert php error (raised by error_reporting) to Exception

但在 php7 中,您不需要将 php 错误转换为异常。

所以你基本上应该扩展简单的 Exception 或者你可以在标准情况下使用这些预定义的 SPL Exceptions 集(例如 InvalidArgumentExceptionOutOfBoundsExceptionBadFunctionCallException, ...)

除了 and 之外,下面的层次结构可能有助于可视化 supported/built-in 异常类型,人们可能会使用这些异常类型来代替通用 ExceptionThrowable,因为这些有时可能会导致如果不恰当地抓住,会出现非常意外的行为。

Lists of Throwable and Exception tree as of 8.1.0

Error
   ArithmeticError
      DivisionByZeroError
   AssertionError
   CompileError
      ParseError
   FiberError
   TypeError
      ArgumentCountError
   UnhandledMatchError
   ValueError
Exception
   ClosedGeneratorException
   DOMException
   ErrorException
   IntlException
   JsonException
   LogicException
      BadFunctionCallException
         BadMethodCallException
      DomainException
      InvalidArgumentException
      LengthException
      OutOfRangeException
   PharException
   ReflectionException
   RuntimeException
      OutOfBoundsException
      OverflowException
      PDOException
      RangeException
      UnderflowException
      UnexpectedValueException
   SodiumException

Find the script and output in the following links:
https://gist.github.com/mlocati/249f07b074a0de339d4d1ca980848e6a
https://3v4l.org/f8Boe

来源:https://www.php.net/manual/en/class.error.php#126795 [来自 dams at php dot netwhysteepy at gmail dot com]

有趣的是,Whosebug 上的语法高亮库还没有为 8.0+ 更改着色(截至 2021 年 1 月;https://i.stack.imgur.com/c5MSn.png)。