Перезапись обработчиков исключений, предоставляемых классами - PullRequest
0 голосов
/ 23 сентября 2019

Я не смог найти много по этому вопросу, но я также не уверен, как его искать, поэтому мои извинения, если это дубликат.

В настоящее время у меня есть большое количествокода, со случайными запросами MySQL.Иногда соединение mySQL (которое создается при запуске программы и становится доступным для методов, которые хотели бы его использовать, чтобы новые соединения не создавались постоянно) по той или иной причине прерывалось.Например, вот исключение, которое может быть вызвано: mysql.connector.errors.OperationalError: MySQL Connection not available.

Когда возникает исключение, я хотел бы, чтобы программа попыталась восстановить соединение с базой данных, и если это не удалось, отправьтеоповещение (через OpsGenie, электронную почту и т. д.).Это довольно тривиально и не та часть, с которой я борюсь.

Теперь я подумал о том, как это сделать во всей программе, и я знаю, что могу обернуть каждый оператор запроса mySQL в попытку ... поймать ..., но я чувствую, что это может бытьгрязный и неэффективный.Мне было интересно, есть ли способ, которым я мог бы:

  • переписать обработчики исключений в пакете mySQL, чтобы содержать мой код для выполнения вышеупомянутого, или
  • создать что-то вроде"global" оператор try ... catch ... (без фактического переноса всей программы в try ... catch ...), который будет перехватывать любые исключения подключения mySQL и обрабатывать их, как указано выше (возможно, с помощью декоратора метода?)

и что будет более эффективным или уместным (если таковые имеются).

Понимание и мысли высоко ценится.

Примечание: я использую Python 3. Для этого проекта.

Обновление

Вот как я решил эту проблему:

#method
def getNewCursor():
    try:
        return(db.cursor())
    except OperationalError:
        #handle error...

#in practice
cur = getNewCursor()
cur.execute("...the SQL query...")
... etc

Я сделал это вместо этогосоздания метода для обработки всего запроса, чтобы я мог просто получить объект курсора и использовать его так, как мне нужно, поскольку ошибки соединения возникают при создании нового курсора.

1 Ответ

1 голос
/ 23 сентября 2019

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

Я бы этого не делал.Это может вызвать побочные эффекты в других частях вашего кода или даже в сторонних библиотеках, которые вы используете / можете использовать.

создает что-то вроде "глобального" оператора try ... catch ... (

Я бы предпочел сделать это. Это кажется более легким в обслуживании и менее подверженным ошибкам.


def run_sql(self, query, retry_times=3):
    try:
        # logic to run the query
    except OperationalError:
        if max_retries:
            send_notification(query)
            raise
        else:
            # logic to run the query again and decrements the max_retries counter
...