Не могу поймать Symfony FatalErrorException

У меня есть такой код:

try {
$var = $object->getCollection()->first()->getItem()->getName();
} catch(\Exception $e) {
$var = null;
}

Конечно, у меня есть коммуникативные имена переменных и методов. Это просто демонстрация.

Поэтому, если моя коллекция пуста, Collection :: first () вернет false. Затем вызов getItem генерирует исключение Symfony \ Component \ Debug \ Exception \ FatalErrorException, которое не будет перехвачено приведенным выше кодом.

Мой вопрос заключается в том, как я могу поймать это исключение? У меня такие длинные цепочки со многими геттерами, которые могут возвращать ноль. Поэтому я предпочитаю этот способ, а не проверять каждое значение на ноль.

21

Решение

использование Throwable класс вместо исключение учебный класс:

try {
$var = $object->getCollection()->first()->getItem()->getName();
} catch(\Throwable $e) {
$var = null;
$msg = $e->getMessage();
}

Начиная с PHP 7.0 исключения, генерируемые из фатальных и восстанавливаемых ошибок, являются экземплярами нового и отдельного класса исключений: Error, Это новый Error реализует класс Throwable интерфейс, который определяет методы, почти идентичные тем из Exception, Так как Throwable выше по иерархии, вы можете поймать с ним, \ Error и \ Exception.

interface Throwable
|- Exception implements Throwable
|- ...
|- Error implements Throwable
|- TypeError extends Error
|- ParseError extends Error
|- ArithmeticError extends Error
|- DivisionByZeroError extends ArithmeticError
|- AssertionError extends Error
36

Другие решения

Как вы видете Вот, FatalErrorException расширяется ErrorException (PHP), который расширяет себя php исключение учебный класс.

Теперь, когда у вас есть все эти элементы, вы готовы к следующему шагу: как следует из названия исключения, это FatalError (концепция, связанная с PHP, а не с Symfony2; в этом случае они создали класс-оболочку для этой ошибки, возможно для целей интерфейса).

Неустранимая ошибка PHP не поддается отслеживанию, поэтому довольно бесполезно хранить код, который может вызвать FatalError, внутри try ... catch блок

Как правило, вы должны проверять, когда возможно, возвращаемые значения, прежде чем пытаться получить к ним доступ.

13

Хорошо. Я нашел обходной путь. Я использую компонент доступа к свойствам, который выдает простые исключения, а не фатальные ошибки.

$pa = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor();
try {
$var = $pa->getValue($object, 'collection[0].item.name');
} catch(\Exception $e) {
$var = null;
}
1

У меня работает (PHP 7.0, Symfony 3.0.9):

use Symfony\Component\Debug\Exception\FatalThrowableError;
...
try {
throw new FatalErrorException("something happened!", 0, 1, __FILE__, __LINE__);
} catch (FatalErrorException $e) {
echo "Caught exception of class: " . get_class($e) . PHP_EOL;
}

Выход:

Caught exception of class: Symfony\Component\Debug\Exception\FatalErrorException

0

Можете ли вы попробовать это:

$foo = $object->getCollection()->first();
if($foo){
$var = $foo->getItem()->getName();
} else {
// fallback
}
-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector