我目睹了一些关于PHP在最近项目中的异常处理的奇怪行为。案例如下。
在我的应用中,我使用命名空间。所有类都在单独的源代码文件中。与此特定案例相关的代码分为3个类别。
“最外层”类是一个调度程序(或路由器),它将调度调用包装在try-catch块中。调度请求调用第三个类中的方法,该类运行代码(包装在try-catch块中),这会导致异常。
因为我在发生错误的类中省略了use Exception;
语句,抛出的异常一直涓涓细流回到最外层(调度程序),它被捕获 - 导致我划伤我的脑袋为什么导致错误的代码周围的捕获不起作用。
Class not found
异常/错误,导致我在代码中出现实际错误,而不是尽可能地“保持活着”。
这应该作为错误提交,还是这种预期行为?
编辑:代码示例
档案:class-a.php
<?php
namespace hello\world;
class classA {
protected $b;
public function __construct() {
$this->b = new \hello\world\classB();
}
public function doSomething() {
try {
$this->b->throwException();
} catch (Exception $e) {
}
}
}
档案:class-b.php
<?php
namespace hello\world;
class classB
{
public function throwException() {
throw new \Exception("bar closed");
}
}
档案:run.php
<?php
include 'class-a.php';
include 'class-b.php';
$a = new \hello\world\classA();
$a->doSomething();
ClassB throw
是\Exception
中的ClassB::doSomething()
,其中ClassA
有一个catch
- 子句,但因为ClassA
没有声明use Exception
或catch (\Exception)
,catch
不匹配,执行以Uncaught exception
错误 1 结束。但在我看来,它应该导致Class not found
错误。
我可能期望过多的宽松PHP编译器,但它有助于追踪编辑器应该很容易发现的愚蠢错误。
1 如果$a->doSomething()
中的run.php
被try..catch
条款包围,则Exception
会(或至少可能)被捕获那里,因为它涓涓细流。
答案 0 :(得分:3)
PHP的异常捕获机制不会验证您捕获的类实际存在。
在函数中使用typehinting时它表现出相同的行为,所以我怀疑它只是将异常/函数类型提示转换为字符串或其他东西,并将其与相关对象的类型进行比较。
这是否是一个错误是值得怀疑的。我个人认为它应该归类为一个bug,但PHP有各种不稳定的行为:D