PHP 7中Error和ErrorException之间的区别


Difference between Error and ErrorException in PHP 7

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

据我所知,Error是一个异常,我应该用它来捕获所有内部PHP错误,比如类型错误,但我不知道ErrorException异常的目的是什么。它们中的每一个有什么用,我应该以它们中的任何一个为基础进行自定义异常,还是应该坚持使用通常的Exception

您可以从该页面了解Error类的用途,该页面描述php 中的错误

PHP 7改变了PHP报告大多数错误的方式。而不是通过传统错误报告机制报告错误PHP 5使用,现在大多数错误都是通过抛出错误来报告的例外情况。

Error页面上的描述相同:

Error是所有内部PHP错误的基类。

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

你可以从这个好的SO问题/答案中获得ErrorException的目的:

ErrorException主要用于转换php错误(由error_reporting)到异常

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

因此,您基本上应该扩展简单的Exception,或者您可以在标准情况下使用这些预定义的SPL异常集(例如InvalidArgumentExceptionOutOfBoundsExceptionBadFunctionCallException…)

除了@alexander.polomodov和@kael之外,下面的层次结构可能有助于可视化支持/内置的异常类型,可以使用这些类型来代替通用的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

在以下链接中查找脚本和输出:
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]

有趣的是,StackOverflow上的语法高亮库还没有对8.0+的更改进行着色(截至2021-01;https://i.stack.imgur.com/c5MSn.png)