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


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

Мое решение:

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

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

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

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

Author: riser101, 2016-01-11

1 answers

Да.

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

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

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

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

 6
Author: geggleto, 2016-01-11 07:19:35