Задать вопрос
svisch
@svisch

Как перехватить исключение выбрасываемое из-за несуществующего метода объекта?

Здравствуйте. В коде надо отловить исключение, если метод у объекта не существует.
Пробовал так:
try {
    $value = $obj->method1();
} catch (Exception $e) {
    $value = $obj->method2();
}


Но так почему то исключение не перехватывается.
Смотрел пошагово выполнение кода - в итоге в HttpKernel выполнение кода сразу переходит на finaly без выбрасывания исключения.
HttpKernel.php
public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response
    {
        $request->headers->set('X-Php-Ob-Level', (string) ob_get_level());

        $this->requestStack->push($request);
        try {
            return $this->handleRaw($request, $type);
        } catch (\Exception $e) {
            if ($e instanceof RequestExceptionInterface) {
                $e = new BadRequestHttpException($e->getMessage(), $e);
            }
            if (false === $catch) {
                $this->finishRequest($request, $type);

                throw $e;
            }

            return $this->handleThrowable($e, $request, $type);
        } finally {
            $this->requestStack->pop();
        }
    }


Вопрос как все-таки обойти такое поведение? Насколько я понимаю надо чтобы handle() запускался с параметром $catch=false. Может есть какой-то способ это сделать именно для конкретного метода контроллера? Или еще какой-то способ поимки исключения.
Спасибо.
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
@MaLuTkA_UA
Для подобных целей существует функция method_exists.

Ваш вариант хоть и рабочий но очень дорогой по ресурсам сервера.
Ответ написан
svisch
@svisch Автор вопроса
Вдруг кому пригодится - несуществующий метод генерирует класс не Exception, а Error. Так все заработало
try {
    $value = $obj->method1();
} catch (\Error $e) {
    $value = $obj->method2();
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы