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

标签 python mysql python-3.x oop exception

我无法找到太多相关信息,但我也不确定如何搜索它,所以如果这是重复的,我深表歉意。

目前,我有大量代码,其中偶尔会出现 mySQL 查询。有时,mySQL 连接(在程序启动时实例化,并可供想要使用它的方法访问,以便不会不断建立新连接)会由于某种原因而失败。例如,以下是可能引发的异常: mysql.connector.errors.OperationalError:MySQL 连接不可用。

当引发异常时,我希望程序尝试重新建立与数据库的连接,如果失败,则发送警报(通过 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

我这样做,而不是创建一个方法来处理整个查询,这样我就可以获取一个游标对象并根据需要使用它,因为创建新游标时会出现连接错误。

最佳答案

overwrite the exception handlers in the mySQL package to contain my code to do the above, or

我不会那样做。这可能会对您的代码的其他部分甚至您正在使用/可能使用的第 3 方库产生副作用。

create somewhat of a "global" try...catch... statement (

我宁愿这样做。这似乎更易于维护并且更不容易出错。


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

关于python - 覆盖类提供的异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58055461/

相关文章:

python - 如何使用python将数据快速加载到内存中?

python - 2020 年 Google 编程挑战题 : Unspecified Words

python - 在我的脚本中包含一个 python 库

php - 选择刷新 php mysql 上的新查询

php - 使用 PHP mysql 显示阿拉伯数据时出错

php - AJAX PHP-加载前一个插入的记录而不是第一个

python - 跳得太快?

python - 为什么我收到 "NameError: name ' df' 未定义”?

python - list() 函数在 Python 中有什么作用?

python-3.x - 将python2 'file'类的一个子类移植到python3