【问题标题】:Which PHP SPL Exception should you throw if a class doesn't exist如果一个类不存在,你应该抛出哪个 PHP SPL 异常
【发布时间】:2012-08-10 10:15:30
【问题描述】:

如果一个类不存在,你应该抛出哪个PHP SPL Exception?在ZF2 coding standards for exceptions 的上下文中。

在标准中,它说异常应该从PHP's SPL Exceptions 之一扩展。我的第一个猜测是它是某种 RuntimeException。

PHP SPL Exceptions

【问题讨论】:

  • IMO 它将是 InvalidArgumentException,因为传递给自动加载器的参数无效(它指定了无效的类名)。虽然我不确定这一点,因为文档似乎表明这应该用于无效 type 的参数。
  • 我同意;来自一个无效参数的自动加载器。但是,如果您在使用 class_exists() 检查类名后抛出异常怎么办?
  • RuntimeExceptionException thrown if an error which can only be found on runtime occurs. - 对于未找到类的错误,我不同意这一点。如果该类不存在,则可以在运行前检测到。但这取决于您对“检测到”的定义-手册在这一点上有点不清楚。我个人觉得抛出InvalidArgumentException 更有意义,因为无论您是尝试自动加载还是仅仅执行class_exists(),您传递的字符串都表示无效的类名,因此是无效的参数。
  • 看看这篇博文:codeutopia.net/blog/2011/05/06/…它可以给你一些线索。
  • 好吧,我会按字面意思解释它——程序运行的时间(或期间)。在 PHP 中,这往往是非常短暂的,因为它所做的事情的本质。如果您的应用程序是静态的并且仅由您开发,您(或您的 IDE)可以通过查看该类是否存在来检测该类是否存在。我想得越多,如果您费心检查一个类是否存在,您可能会允许更多的动态行为,RuntimeException 实际上可能更合适。但如果你想太多,那么 everything 就是运行时错误。

标签: php exception conventions zend-framework2 code-standards


【解决方案1】:

取决于您的应用程序的上下文。

如果您将类名作为方法参数接收,并且您尝试在同一方法中加载该类,那么您应该使用 InvalidArgumentException 异常。

如果您从字段值或方法接收类名,那么您应该使用 RuntimeException

【讨论】:

    【解决方案2】:

    如果不存在自动加载,PHP 会吐出 RunTimeException 对吗?所以如果你的加载器没有找到类,它应该做同样的事情。 (如果你正在编写自己的自动加载器)基于 ZF2 编码标准,它应该抛出一个在加载器的异常命名空间内的 RunTimeException。

    因此,如果您的加载程序在 My\Loader 中,那么您的运行时异常将在 My\Loader\Exception\RunTimeException 中。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多