Как бороться с недоступным хостом (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()
Другие вопросы по тегам