yaleksandr89
@yaleksandr89
Junior PHP developer

Не корректно отрабатывает try\catch. Как исправить?

Здравствуйте.
С исключениями как в рамках PHPMailer, так и PHP можно сказать не работал (слышать слышал, но не использовал), поэтому не судите строго, если делаю какую-то банальную ошибку.

На тостер полез, потому что голова уже пухнет, от информации, которую я прочитал про исключения и вроде бы все делаю как рекомендуется, но все равно не выходит сделать, что требуется.

Суть в следующем, для рассылки писем использую PHPMailer, рассылка работает, теперь необходимо обернуть проверками, "некоторые этапы работы" (наверное так будет правильнее выразиться): отправка писем, проверка подключаемого шаблона письма, корректность получаемых данных и т.д.

Буксую на создание проверки при отправки письма mailer->send();
Ход действий такой:
1. Создаю свой класс EmailSendingFailed, наследуюсь от Exception
<?php declare(strict_types=1);

namespace extMailer;

use Exception;

class EmailSendingFailed extends Exception {}


Далее в классе, который расширяет стандартный класс PHPMailer, добавляю

namespace extMailer;

use EmailSendingFailed;

...

//В методе отвечающим за отправку реализую try\catch
public function sending(string $event, EmailAddress $recipient, array $tpl = array()): void
    {
        $this->mailer->addAddress($recipient->email, $recipient->name);
        $this->mailer->Subject = $subject;
        $this->mailer->Body = $body;
        $this->mailer->isHTML(true);
        try {
            if (!$this->mailer->send()) {
                throw new EmailSendingFailed("Couldn't send email. Invalid sender address '{$recipient->email}'.");
            }
        } catch (Exception $e) {
            $e->getMessage();
        }
        $this->mailer->ClearAddresses();
    }


После чего "ломаю" send(); (указываю некорректный формат mailmail.ru). В итоге письма перестают отправляться (что вполне логично :) ), но вот исключение не выбрасывается.

Просмотрел дебагером, исключение генерируется, попадает в блок catch и скрипт продолжает работать (хотя его работа должна прерываться). Не подскажите из-за чего такая штука может происходить?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 3
irishmann
@irishmann
Научись пользоваться дебаггером
Так ты перехватил ошибку, но не выводишь ее.
Просмотрел дебагером, исключение генерируется, попадает в блок catch и скрипт продолжает работать (хотя его работа должна прерываться). Не подскажите из-за чего такая штука может происходить?

У тебя еще есть код после try-catch, вот он и выполняется.

UPD. Примерно так должен выглядеть ваш метод
<?php
    public function sending(string $event, EmailAddress $recipient, array $tpl = array()): void
    {
        try {
            $this->mailer->addAddress($recipient->email, $recipient->name);
            $this->mailer->Subject = $subject;
            $this->mailer->Body = $body;
            $this->mailer->isHTML(true);
            if (!$this->mailer->send()) {
                throw new EmailSendingFailed("Couldn't send email. Invalid sender address '{$recipient->email}'.");
            }
            return ['status' => 'success'];
            $this->mailer->ClearAddresses();
        } catch (Exception $e) {
            return ['status' => 'error', 'error_message' => $e->getMessage();];
        }
    }


Результат выполнения - массив со статусом, и если есть, с текстом ошибки.
Ответ написан
Adamos
@Adamos
Зря паникуете - у вас все работает. Особенно строчка
$e->getMessage();
Вы же в курсе, что именно она делает?
Ответ написан
@2vtlk
В вашем коде даже если вы словили исключение - вы его никак не обработали.
Если вы оставите блок catch пустым - результат будет таким же.

Конструкция
$e->getMessage();
Возвращает строку с ошибкой, но вы никуда её не выводите и выполнение скрипта не прерываете.
Протестируйте к примеру
echo $e->getMessage();
И вы увидите текст ошибки
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы