【发布时间】:2020-07-16 10:45:29
【问题描述】:
我正在为客户端创建的自定义插件实现插件控制器类。 由于每个插件的类名称很可能最终与已安装的其他插件发生冲突,我想确保当新插件出现时我们不会出现致命错误。 我想向用户报告新插件与已安装的插件发生冲突。
所以基本上 atm 我用两个包含完全相同代码的文件进行测试并且得到:
Fatal error: Cannot declare class [myclassname], because the name is already in use
我尝试使用以下方法捕获此问题,但没有成功:
try {
include_once $file;
} catch (ClosedGeneratorException|DOMException|ErrorException|IntlException|LogicException|BadFunctionCallException|BadMethodCallException|DomainException|InvalidArgumentException|LengthException|OutOfRangeException|PharException|ReflectionException|RuntimeException|OutOfBoundsException|OverflowException|PDOException|RangeException|UnderflowException|UnexpectedValueException|SodiumException $ex) {
echo "Unable to load file.";
}
所有这些都是我从 https://www.php.net/manual/en/class.exception.php 7.2.0 的 Lists of Throwable 和 Exception 树中获得的
手册规定:
抛出的对象必须是 Exception 类的实例或 异常的子类。试图扔一个不是意志的物体 导致 PHP 致命错误。
这可能不是 Exception 类的实例/子类的对象吗? 我错过了什么?
【问题讨论】:
-
“我错过了什么?” - 任何地方都没有人首先抛出任何异常。你试图捕捉一些不存在的东西。
-
如何知道致命错误不是“可捕获”的?
-
任何可捕获的内容都会有一条错误消息,类似于“致命错误:未捕获的错误...”。注意 Error 中的大写 E - 它专门指 Error 类,它是
Throwable的子类型 -
您的评论是基于经验还是您在某处读过此内容?链接?
-
两者兼而有之 - Throwable 层次结构在文档here 中进行了解释,但我不知道有任何好的文档说明哪些内部错误在新层次结构下,哪些不是。