Не удается поймать исключения в laravel
у меня следующая ситуация:
try {
DB::beginTransaction();
$task = new Task();
$task->setTracker("");
//thrown SymfonyComponentDebugExceptionFatalThrowableError
DB::commit();
}catch (Exception $e){
DB::rollBack();
Log::error($e);
//throw $e;
}
Я не вхожу в область улова.
Есть идеи почему?
обновление
Это ошибка:
[SymfonyComponentDebugExceptionFatalThrowableError]
Type error: Argument 1 passed to AppModelsTask::setTracker() must be an instance of CarbonCarbon, 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) {
//
}
редактировать
Ok, поэтому в дополнение к вышеуказанному решению кажется, что PHP 7 + обрабатывает ошибку немного иначе, чем PHP 5. Так что попробуй это..
try {
//
} catch(Error e) {
// This should work
} catch(Throwable e) {
// This should work as well
}
компонент отладки Symfony намного сложнее, чтобы регистрировать и сообщать обо всех видах ошибок, но посмотрите на этот простой пример (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 () на boolean in /in/WJErU:6
трассировка стека:
- 0 [внутренняя функция]: myExceptionHandler(объект (ошибка))
1 {main}
брошен в /в / WJErU на линии 6
и вы не можете поймать это исключение, потому что вы должны поймать оригинала.. throwable здесь, который для такого рода "ошибки". Вы можете поймать его, поймав класс" Error". И с иерархией PHP7 он реализует интерфейс Throwable, поэтому вы не можете поймать его с помощью исключения (потому что, хотя исключение реализует Throwable, Error не является исключением - смотри:http://php.net/manual/en/language.errors.php7.php).
и это верно для PHP7+, потому что с 5.* не было ни Throwable ни ошибки, и делать $foo->modify();
просто остановит скрипт и вернет фатальную ошибку. Вы можете сделать свой собственный обработчик ошибок (set_error_handler
) и выбросить там исключение (и компонент отладки делает это для php 5.* ) но этот метод не работает для фатальных ошибок. Вместо этого компонент отладки подключается к завершение работы скрипта и читает последние ошибка и бросает FatalErrorException.
это описание может быть не совсем точным, поскольку я не углублялся в Symfony, но вы можете получить идею здесь.