覆盖类提供的异常处理程序

时间:2019-09-23 03:55:48

标签: python mysql python-3.x oop exception

我对此一无所知,但是我也不确定如何搜索,因此如果重复,我深表歉意。

当前,我有大量的代码,偶尔还会进行mySQL查询。有时,由于某种原因或其他原因,mySQL连接(在程序启动时实例化,并使其可以使用它的方法可以访问,从而不会不断建立新的连接)会失败。例如,可能会引发以下异常: mysql.connector.errors.OperationalError: MySQL Connection not available.

发生异常时,我希望程序尝试重新建立与数据库的连接,如果失败,则发送警报(通过OpsGenie,电子邮件等)。这是微不足道的,而不是我正在努力的部分。

现在,我已经考虑了如何在整个程序中执行此操作,并且我知道可以将每个mySQL查询语句包装在try ... catch ...中,但是我觉得这可能是混乱且效率低下的。我想知道是否有一种方法可以做到:

  • 覆盖mySQL包中的异常处理程序以包含执行上述操作的代码,或者
  • 创建一些“全局” 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 个答案:

答案 0 :(得分:1)

  

覆盖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