Является ли перехват исключения и продолжение выполнения программы лучшей практикой?

Мое приложение подключается к rabbitMQ. Иногда он бросает AMQPTimeoutException. Более конкретно: "Ошибка отправки данных. Время соединения сокета".

Мое решение:

Я улавливаю AMQPTimeoutException и вызываю метод reconnect. После чего программа продолжает нормальное выполнение. Также я установил флаг, чтобы исключение обрабатывалось почти 3 раза.

try
{
    sendMethod($message);
} catch (AMQPTimeoutException $e) {
      echo "caught socket connection exception". "\n";
      $this->reconnect($message, $exchangeName, $queue);
  }
//reconnect internally checks the flag

Мой вопрос: Это лучшая практика? Если не возможны другие решения?

Примечание. Приложение написано на PHP.

Ответ 1

Да.

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

В вашем сценарии вполне разумно ловить исключения, когда дело доходит до сокетов. Связь TCP/IP не идеальна, и в зависимости от широкого диапазона условий сбой сокета на 100% определен в определенный момент времени.

Я бы порекомендовал, что вы начинаете регистрировать ПОЧЕМУ эти тайм-ауты сокетов происходят. Как правило, они вызваны истощением ресурсов, но где это? Сервер A или Сервер B... или тот клиент...

Тайм-ауты являются симптомом проблемы, которую необходимо исследовать. Хотя вы правильно их обрабатываете, я настоятельно рекомендую добавить некоторые протоколы, чтобы узнать, почему они происходят.