【问题标题】:Overwriting Exception Handlers Provided By Classes覆盖类提供的异常处理程序
【发布时间】:2020-01-23 02:40:59
【问题描述】:

我没能找到很多关于这个,但我也不确定如何搜索它,所以如果这是重复的,我很抱歉。

目前,我有大量代码,偶尔会出现 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

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

【问题讨论】:

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


    【解决方案1】:

    覆盖 mySQL 包中的异常处理程序以包含执行上述操作的代码,或者

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

    创建某种“全局”的 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
    

    【讨论】:

    • 天啊!估计我真的是想多了。这是个好主意,谢谢!您在覆盖包异常处理程序方面提出了一个很好的观点,我没想到 3rd 方库会因此而中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2016-06-04
    • 2021-09-12
    • 2021-09-17
    • 2018-11-06
    相关资源
    最近更新 更多