【问题标题】:What Exception subclasses are built into PHP?PHP 中内置了哪些异常子类?
【发布时间】:2012-06-05 23:38:39
【问题描述】:

我还没有找到 PHP 中所有内置 Exception 子类的列表。在创建我自己的异常子类之前,我宁愿在有意义的时候使用内置的。

例如,我知道 InvalidArgumentException 存在,但似乎没有任何东西可以与 Java 的 NullPointerException 相比。

是否有人拥有或可以链接到 PHP 中可用的异常子类列表?

【问题讨论】:

  • PHP 没有 NULL 指针。尝试读取未定义的变量不是错误,只会导致通知。
  • 其实,如果处理对象,PHP可以发出PHP Fatal error: Call to a member function on a non-object。这可能是最接近 NullPointerException 的事情。您的实例化/客户端代码应该验证对象的创​​建/有效性。除此之外,您可以设置set_error_handler
  • @EmilVikström 这可能不是 PHP 中的错误,而是代码逻辑中的错误,这是使用异常的部分原因。
  • @webbiedave 具体来说,我正在编写其他人会调用的代码。我不知道他们是否会正确使用我的代码,我也没有责任纠正问题,只是让他们知道他们犯了错误。但这个问题通常是为了获取有关可用异常的信息。
  • 我明白了。我以为你在试图处理它们。您正在尝试找出可以扔的东西。

标签: php class exception exception-handling


【解决方案1】:

PHP 5 有两个内置异常

PHP 中的库有自己的内置异常

  • DOMException DOM 操作在特定情况下会引发异常,例如,当操作因逻辑原因无法执行时。
  • IntlException 他的类用于在 intl 函数内部发生错误时生成异常。此类异常仅在启用 intl.use_exceptions 时生成。
  • PharException 使用 Phar 类时抛出
  • ReflectionException 使用反射类时抛出

SPL includes a few of its own built in exceptions:

PHP 7 引入了新的异常,包括可捕获的错误。新的例外情况包括:

  • Throwable 是 PHP 7 中可以通过 throw 语句抛出的任何对象的基本接口,包括错误和异常。
  • Error 是所有 PHP 内部错误的基类。
  • AssertionError 在通过 assert() 的断言失败时抛出。
  • ParseError 在解析 PHP 代码时发生错误时抛出,例如调用 eval() 时。
  • TypeError 在三种情况下可能会抛出 TypeError。第一个是传递给函数的参数类型与其对应的声明参数类型不匹配。第二个是从函数返回的值与声明的函数返回类型不匹配。第三个是将无效数量的参数传递给内置 PHP 函数(仅限严格模式)。
  • ArithmeticError 在执行数学运算时发生错误时抛出。在 PHP 7.0 中,这些错误包括尝试执行负数移位,以及任何对 intdiv() 的调用都会导致值超出可能的整数范围。
  • DivisionByZeroError 在尝试将数字除以零时抛出。
  • 当传递给用户定义的函数或方法的参数太少时,会抛出 ArgumentCountError

PHP 7.3 引入了 JSON 异常:

  • json_encode()json_decode() 遇到错误时,会抛出JsonException

PHP 8 引入了一个新异常:

  • ValueError 在您将值传递给具有有效类型但不能用于操作的函数时抛出。

这是一个演示 PHP 7 中引入的新层次结构的图表:

\Throwable
├── \Exception (implements \Throwable)
|   |── \DOMException (extends \Exception)
|   ├── \IntlException (extends \Exception)
|   ├── \JsonException (extends \Exception)
|   |── \PharException (extends \Exception)
|   |── \ReflectionException (extends \Exception)
|   |── \ValueError (extends \Exception)
│   ├── \LogicException (extends \Exception)
│   │   ├── \BadFunctionCallException (extends \LogicException)
│   │   │   └── \BadMethodCallException (extends \BadFunctionCallException)
│   │   ├── \DomainException (extends \LogicException)
│   │   ├── \InvalidArgumentException (extends \LogicException)
│   │   ├── \LengthException (extends \LogicException)
│   │   └── \OutOfRangeException (extends \LogicException)
│   └── \RuntimeException (extends \Exception)
│       ├── \OutOfBoundsException (extends \RuntimeException)
│       ├── \OverflowException (extends \RuntimeException)
│       ├── \RangeException (extends \RuntimeException)
│       ├── \UnderflowException (extends \RuntimeException)
│       └── \UnexpectedValueException (extends \RuntimeException)
└── \Error (implements \Throwable)
    ├── \AssertionError (extends \Error)
    ├── \ParseError (extends \Error)
    └── \TypeError (extends \Error)
        └── \ArgumentCountError (extends \TypeError)
    └── \ArithmeticError (extends \Error)
        └── \DivisionByZeroError extends \ArithmeticError)

【讨论】:

  • 谢谢约翰,但这不是一个完整的列表。所以我用包含信息的文档的链接创建了一个答案。
  • 加倍努力并将它们全部连接起来。很棒。
  • 很抱歉跑题了,但对我来说,在发布这个答案 2.5 年后,它只被投票了 17 次,这有点令人遗憾。
  • @ex3v 认为这是对 SO 用户或 PHP 开发人员的评论?
  • @ex3v 除非我想发表评论,否则我不会费心登录 SO,所以如果它让我退出,除非我要发表评论,否则我无法投票。
【解决方案2】:

其实,现在我崩溃了,问了,我还是设法找到了他们。

从技术上讲,PHP 似乎只有 2 个内置异常: http://www.php.net/manual/en/reserved.exceptions.php

SPL 还定义了几个: http://www.php.net/manual/en/spl.exceptions.php

解释他们的层次结构: http://www.php.net/~helly/php/ext/spl/classException.html http://web.archive.org/web/20130829124146/http://www.php.net/~helly/php/ext/spl/classException.html(2013 年 8 月 29 日存档)

更新

上面的链接失效了,它是一个基本的 PHP 异常层次结构图。我找不到原件,但这里有一个替代品:

最初发现于http://fossies.org/dox/php-5.2.17/classException.html,现在存档于http://web.archive.org/web/20151002165210/https://fossies.org/dox/php-5.2.17/classException.html(存档于 2015 年 10 月 2 日)

【讨论】:

  • @Hirnhamster 谢谢,包括一张图片来替换死链接。
猜你喜欢
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2010-10-31
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多