Является ли перехват исключения и продолжение выполнения программы лучшей практикой?
Мое приложение подключается к 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.
1 answers
Да.
Исключения всегда должны быть перехвачены и обработаны. Это, безусловно, лучшая практика. Исключения составляют структуры потока управления на языке, который позволяет программистам иметь дело с вещами, которые они не ожидали или очень редко ожидают.
В вашем сценарии вполне разумно перехватывать исключения, когда дело доходит до сокетов. Связь TCP/IP не идеальна, и в зависимости от широкого спектра условий отказ сокета на 100% гарантирован при в какой-то момент времени.
Что я бы рекомендовал, так это начать регистрировать, ПОЧЕМУ происходят эти тайм-ауты сокетов. Как правило, они вызваны исчерпанием ресурсов, но где это? Сервер A или Сервер B... или этот клиент...
Тайм-ауты являются симптомом проблемы, которую необходимо исследовать. Пока вы правильно их обрабатываете, я настоятельно рекомендую добавить некоторые записи, чтобы выяснить, почему они происходят.