Twitt
@Twitt

Зачем в catch делать throw?

Вижу в проекте в коде такое:
try {
            $this->initDBConnect();
        } catch (\Exception $e) {
            throw $e;
        }

Причем вижу не в одном месте примерно такое поведение. Вопрос: в чем суть в catch делать throw? Чем отличается от того, чтобы просто не делать try/catch?
Я думал, что в catch обычно логируют что-то, но тут происходит именно просто throw
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
try {
    $this->initDBConnect();
} catch (\Exception $e) {
    // Тут залогировали
   $this->logger->error('Некоторое сообщение', [некоторые данные]);

    // тут выкинули дальше
    // или throw new MyAnyException, 
    // а не просто дальше выкидывать тоже самое
    throw $e; 
 }


Для чего бросать дальше
Например идет процесс оплаты товара, в клиенте выкинулось исключение... мы в слое работы с АПИ платежки поймали исключение и залогировали, но выкинули дальше, чтобы наша система выше поймала, откатила транзакцию и плюнула ошибкой уже своей для слоя выше
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Если в catch больше ничего не происходит и нет finally - то такое перекладывание бесполезно.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Хороший вопрос.

1. В catch только одно проверяем конкретное исключение, которое мы ждём и знаем как обработать.
Например, при вставке записи в БД мы можем обработать ошибку уникального ключа, сообщив пользователю, что такой юзернейм уже занят.
Но если ошибка не такая, какую мы ожидали, то она должна быть обработана стандартным способом. Для этого её надо перевыборосить.

2. Если в принципе надо сначала что-то сделать в случае ошибки.
Например, как в предыдущем ответе, залогировать
Или - более распространенный случай - откатить транзакцию.
После этого исключение надо перевыбросить, чтобы ошибка обработалась обычным способом

3. Довольно экзотический случай. Исключение содержит стек вызовов, в котором. помимо прочего, лежат все параметры функций. Иногда эти параметры могут быть довольно чувствительными к раскрытию - например, параметрами конструктора класса для соединения с БД являются параметры подключения к БД. Чтобы очистить стек вызовов, надо бросить новое исключение. Но перевыбрасывать существующее нельзя - недо бросить именно совсем новое исключение, передав в него сообщение об ошибке из старого

Конкретный пример в вопросе - это скорее всего попытка реализовать п.3, только неудачная.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы