Не удается поймать исключения в 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, но вы можете получить идею здесь.