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

Другие вопросы по тегам