Не могу поймать исключения в Laravel
У меня следующая ситуация:
try {
DB::beginTransaction();
$task = new Task();
$task->setTracker("");
//thrown \Symfony\Component\Debug\Exception\FatalThrowableError
DB::commit();
}catch (\Exception $e){
DB::rollBack();
Log::error($e);
//throw $e;
}
Я не вхожу в зону улова.
Есть идеи почему?
Обновить
Это сгенерированная ошибка:
[Symfony\Component\Debug\Exception\FatalThrowableError]
Type error: Argument 1 passed to App\Models\Task::setTracker() must be an instance of Carbon\Carbon, integer given, called in /var/www/app/Services/ShareLogic.php on line 60
и не поймают
Спасибо
3 ответа
Ловля Throwable
сделал трюк.
Понятия не имею почему? Кто-нибудь делает?
Это не ловит исключение, потому что вы пытаетесь поймать \Exception
который Symfony\Component\Debug\Exception\FatalThrowableError
не распространяется.
Вместо этого попробуйте поймать фактическое исключение, импортировав его.
use Symfony\Component\Debug\Exception\FatalThrowableError;
И тогда вы можете сделать..
try {
//
} catch(FatalThrowableError e) {
//
}
редактировать
Итак, в дополнение к вышеупомянутому решению кажется, что PHP 7+ обрабатывает ошибку немного по-другому, чем PHP 5. Так что попробуйте это..
try {
//
} catch(Error e) {
// This should work
} catch(Throwable e) {
// This should work as well
}
Компонент Symfony Debug намного сложнее, чтобы регистрировать и сообщать обо всех видах ошибок, но взгляните на этот простой пример (php 7.1.x):
<?php
class MyUncatchableError extends Exception {}
function myExceptionHandler($e) {
throw new MyUncatchableError('BANG: '.$e->getMessage());
}
set_exception_handler('myExceptionHandler');
$foo = true;
try {
$foo->modify();
} catch (Exception $e) {
echo 'nope';
} catch (MyUncatchableError $e) {
echo 'nope2';
}
Каким будет результат? Что ж:
Неустранимая ошибка: Uncaught MyUncatchableError: BANG: вызов функции-члена modify() для логического значения в /in/WJErU:6
Трассировки стека:
- 0 [внутренняя функция]: myExceptionHandler (Object (Error))
1 {главная}
добавлено в / в / WJErU в строке 6
и вы не можете поймать это исключение, потому что вы должны поймать оригинал.. throwable здесь, что является ошибкой для такого рода "ошибки". Вы можете поймать его, поймав класс "Ошибка". А в иерархии PHP7 он реализует интерфейс Throwable, поэтому вы не можете поймать его с помощью Exception (потому что, хотя Exception реализует Throwable, Error не является исключением - см.: http://php.net/manual/en/language.errors.php7.php).
И это верно для PHP7+, потому что с 5. * не было ни Throwable, ни Error, и делает $foo->modify();
просто остановит скрипт и вернет фатальную ошибку. Вы можете сделать свой собственный обработчик ошибок (set_error_handler
) и выдает исключение (и компонент Debug делает это для php 5.*), но этот метод не работает для фатальных ошибок. Вместо этого компонент Debug подключается к завершению работы скрипта, читает последнюю ошибку и выдает FatalErrorException.
Это описание может быть не совсем точным, так как я не вникнул в Symfony, но вы можете понять эту идею здесь.