Laravel 5 – Как вы перехватываете ошибку Mail::send()?

У меня есть следующий метод, который отправляет электронное письмо:

Mail::send('emails.configuration_test', array(), function($email)use($request){
    $email->to($request->test_address)->subject('Configuration Test');
});

Если вышеуказанные ошибки отсутствуют, я хотел бы иметь возможность поймать исключение. Когда я использую следующее:

try{
    Mail::send('emails.configuration_test', array(), function($email)use($request){
        $email->to($request->test_address)->subject('Configuration Test');
    });
}
catch(Exception $e){
    // Never reached
}

исключение никогда не перехватывается. Вместо этого я получаю трассировку стека Laravel в качестве ответа, если метод send() выдает ошибку.

Как мне поймать исключение в этом случае?


person Lloyd Banks    schedule 06.01.2017    source источник
comment
Если файл имеет пространство имен, вам потребуется catch(\Exception $e) (или поставить use Exception вверху файла). Прямо сейчас он, вероятно, ловит что-то вроде App\Http\Controllers\Exception. php.net/manual/en/language.namespaces.php   -  person ceejayoz    schedule 06.01.2017
comment
Или импортируйте его вверху. Что, я полагаю, у него есть.   -  person DevK    schedule 06.01.2017
comment
@devk Если он получает трассировку стека после catch(Exception $e), то ее нет.   -  person ceejayoz    schedule 06.01.2017
comment
@ceejayoz Достаточно честно. Я думал, вы получите сообщение об исключении Laravel.   -  person DevK    schedule 06.01.2017
comment
@devk Все исключения Laravel в конечном итоге являются подклассами (или под-под-под-под-подклассами) корня \Exception, поэтому перехват \Exception должен охватывать буквально все, если все сделано правильно.   -  person ceejayoz    schedule 06.01.2017


Ответы (1)


Использование корневого пространства имен \Exception помогло.

Вместо:

catch(Exception $e){
    // Never reached
}

Я использовал:

catch(\Exception $e){
    // Get error here
}
person Lloyd Banks    schedule 09.01.2017
comment
Действительно ли это хороший способ использовать исключения? Не могли бы мы создать более конкретное исключение для ошибки отправки почты и отловить ее? Я искал в фреймворке такое исключение, чтобы поймать, но не смог его найти :( Я полагаю, что основная цель здесь состоит в том, чтобы позволить коду продолжаться, если письмо не отправляется, а не останавливать выполнение и прерывать. Но уловка универсальное исключение не очень четко выражает это намерение Просто мой взгляд на это. - person mwal; 22.12.2018
comment
Я понял, что ключевым моментом здесь является то, что laravel использует быструю почтовую программу Symfony, поэтому для этого просто нужно посмотреть документы, а не laravel. - person mwal; 23.12.2018