如果一个类不存在,你应该抛出哪个PHP SPL异常?

3

我同意;从自动加载程序中,那将是一个无效的参数。但是如果您在使用class_exists()检查类名后抛出异常呢? - gawpertron
@gawpertron 再次执行 class_exists("MyClass"),其中你将传递一个参数,如果类不存在,则抛出 InvalidArgument,否则抛出 RuntimeException,我认为这样做是好的。 - Gntem
2
“RuntimeException”表示“如果发生仅在运行时才能发现的错误,则抛出异常。”- 对于类未找到的错误,我不同意这一点。 如果类不存在,则可能可以在运行之前检测到此错误。 但这取决于您对“检测到”一词的定义-手册在这一点上有些不清楚。 我个人认为更合理的方式是抛出“InvalidArgumentException”,因为无论是尝试自动加载还是只是执行“class_exists()”,您传递的字符串都代表无效的类名,因此是无效的参数。 - DaveRandom
1
看看这篇博客文章:http://codeutopia.net/blog/2011/05/06/how-to-use-built-in-spl-exception-classes-for-better-error-handling/ 它可以给你一些线索。 - Xerkus
1
我会相当字面地解释它 - 程序运行的时间(或期间)。在PHP中,由于其本质,这往往是非常短暂的。如果您的应用程序是静态的,并且仅由您开发,则可以通过查看是否存在来检测类是否不存在。我越想越觉得,如果您要检查类是否存在,那么您可能允许更多的动态行为,RuntimeException实际上可能更合适。但是,如果您过度思考,那么所有都是运行时错误。 - DaveRandom
显示剩余3条评论
2个回答

2

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

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

如果您从字段值或方法中接收类名,则应使用RuntimeException。


-1
如果没有自动加载的话,PHP会抛出一个 RunTimeException 对吗?所以如果你自己写一个自动加载器并且找不到类的话,它也应该做同样的事情。基于 ZF2 编码规范,它应该抛出一个在加载器异常命名空间内的 RunTimeException。
所以,如果你的加载器在 My\Loader 中,那么你的运行时异常应该在 My\Loader\Exception\RunTimeException 中。

1
PSR-4规范与此答案相反。"自动加载程序实现不得抛出异常,不得引发任何级别的错误,并且不应返回值。" 这并不意味着应用程序不能抛出异常,但应用程序的自动加载程序永远不应该这样做。 - Seth Battin
我是 PSRs 的粉丝,所以我同意 Seth 的说法。 - Jerry Saravia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接