Как бороться с недоступным хостом (ConnectionRefusedError) в прокси-классе
У меня есть очень простой прокси-класс (друг, который помог мне кодировать его, настаивает на том, что это класс декоратора) для python-mpd2.
Класс выглядит так
import mpd
class MPDProxy:
def __init__(self, host="localhost", port=6600, timeout=10):
self.client = mpd.MPDClient()
self.host = host
self.port = port
self.client.timeout = timeout
self.connect(host, port)
def __getattr__(self, name):
return self._call_with_reconnect(getattr(self.client, name))
def connect(self, host, port):
self.client.connect(host, port)
def _call_with_reconnect(self, func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except mpd.ConnectionError:
self.connect(self.host, self.port)
return func(*args, **kwargs)
return wrapper
mpd_proxy = MPDProxy()
До сих пор это работает хорошо, если для подключения доступен хост mpd. Если нет сервера mpd, я получаю
ConnectionRefusedError: [Errno 111] Соединение отклонено
Я ищу хорошие модели, чтобы справиться с этим исключением
- Можете ли вы придумать элегантный способ предотвратить сбой программы, когда нет доступного хоста?
- Должен ли я перехватывать исключение внутри прокси-сервера или за его пределами при каждом вызове прокси-сервера?
- Является ли строка "Host not available" (или аналогичная) в качестве возвращаемого значения хорошей идеей или метод или функция, вызывающая прокси, могут быть проинформированы лучше?
1 ответ
Можете ли вы придумать элегантный способ предотвратить сбой программы, когда нет доступного хоста?
try ... except
;)
Должен ли я перехватывать исключение внутри прокси-сервера или за его пределами при каждом вызове прокси-сервера?
Вопрос, который вы должны задать себе: "Кто * способен * справиться с этим исключением?"
Очевидно, что прокси не может ничего толкового "починить" ConnectionRefusedError
, Так что это должно быть обработано на верхних уровнях.
Является ли строка "Host not available" (или аналогичная) в качестве возвращаемого значения хорошей идеей или метод или функция, вызывающая прокси, могут быть проинформированы лучше?
Плохая идея. Обычный способ информирования "верхних уровней", чем произошло исключение, заключается в raise
исключение. Или позволить распространенному исключению распространяться вверх.
В частности:
class MPDProxy:
def _call_with_reconnect(self, func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except mpd.ConnectionError:
self.connect(self.host, self.port)
# ^^^^^^ This lime might raise `ConnectionRefusedError`
# as there is no `except` block around, this exception
# is automatically propagated
return func(*args, **kwargs)
return wrapper
try:
mpd_proxy = MPDProxy()
r = mdp_proxy._call_with_reconnect(whatever)
except ConnectionRefusedError:
do_somesible_sensible()