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
中看出Error
class的目的
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 集(例如 InvalidArgumentException
、OutOfBoundsException
、BadFunctionCallException
, ...)
除了 and 之外,下面的层次结构可能有助于可视化 supported/built-in 异常类型,人们可能会使用这些异常类型来代替通用 Exception
或 Throwable
,因为这些有时可能会导致如果不恰当地抓住,会出现非常意外的行为。
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 net
、whysteepy at gmail dot com
]
有趣的是,Whosebug 上的语法高亮库还没有为 8.0+ 更改着色(截至 2021 年 1 月;https://i.stack.imgur.com/c5MSn.png)。
在 PHP 7 的文档中,我注意到两个预定义的异常 Error
and ErrorException
几乎完全相同,ErrorException
具有额外的 $severity
属性 和 Error
仅在 PHP 7 中引入,而 ErrorException
自 PHP 5.1 以来就存在。
据我所知,Error
是我应该用来捕获所有内部 PHP 错误(例如类型错误)的异常,但我不明白它的目的是什么ErrorException
异常。它们各自有什么用,我应该根据它们中的任何一个来创建自定义异常,还是应该坚持使用通常的 Exception
?
你可以从这个page which describes errors in php
中看出Error
class的目的
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 集(例如 InvalidArgumentException
、OutOfBoundsException
、BadFunctionCallException
, ...)
除了 Exception
或 Throwable
,因为这些有时可能会导致如果不恰当地抓住,会出现非常意外的行为。
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 net
、whysteepy at gmail dot com
]
有趣的是,Whosebug 上的语法高亮库还没有为 8.0+ 更改着色(截至 2021 年 1 月;https://i.stack.imgur.com/c5MSn.png)。