Я наблюдал странное поведение, связанное с обработкой исключений в PHP в недавнем проекте.Кейс выглядит следующим образом.
В моем приложении я использую пространства имен.Все классы находятся в отдельных файлах исходного кода.Код, относящийся к этому конкретному случаю, распределен по 3 классам.
«Внешний» класс - это диспетчер (или маршрутизатор), который заключает диспетчерский вызов в блок try-catch.Отправленный запрос вызывает метод из третьего класса, который запускает код (заключенный в блок try-catch), который вызывает исключение.
Поскольку я пропустил оператор use Exception;
в классе, гдепроисходит ошибка, сгенерированное исключение просачивается обратно к самому внешнему слою (диспетчеру), где оно перехватывается - заставляя меня почесать голову, почему перехват кода, вызывающего ошибку, не работает.
Мне это кажется странным.По логике вещей, PHP должен в этой ситуации (IMO) выдавать 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
s \Exception
in ClassB::doSomething()
, для которого ClassA
имеет catch
-clause, но поскольку ClassA
не объявляет use Exception
или catch (\Exception)
, catch
не совпадает и выполнение заканчивается с Uncaught exception
ошибкой 1 .Но, на мой взгляд, это должно вызвать ошибку Class not found
.
Возможно, я ожидаю слишком многого от разрешающего компилятора PHP, но это поможет отследить глупые ошибки, которые компилятору будет легко обнаружить.
1 Если бы $a->doSomething()
в run.php
был окружен предложением try..catch
, Exception
был бы (или, по крайней мере, мог бы) быть там пойман, так как он стекался по стеку.