Python在引发异常后添加重试

Posted

技术标签:

【中文标题】Python在引发异常后添加重试【英文标题】:Python Adding a retry after exceptions is raised 【发布时间】:2021-04-07 07:42:15 【问题描述】:

我继承了一个需要重新修改的代码。频谱扫描错误不断发生,这是引发异常的地方:

try:
    # iterate trough each record in json file
    for i in sorted(tables_to_load, key=lambda x: (tables_to_load[x]["order"])):
        # print(i)
        # if table exclude flag is set to "N", proceed with load_table()
        if tables_to_load[i]["exclude"] == "N":
            try:
                job_start_time = datetime.now()
                logger.info("Begin load for: %s ---- %s ----" %(tables_to_load[i]["order"], i))
                error_code = load_table(i, tables_to_load[i], from_date, to_date, max_proc, dm_updated, 
                process_flag)
                job_end_time = datetime.now()
                job_duration = (job_end_time - job_start_time).total_seconds()
                logger.info("Load for table: %s -- time: %s seconds." %(i, job_duration))
            except Exception as e:
                #this is where the error is cought
                logger.error("Load for table: %s FAILED: %s" %(i, e))
                raise
        #else the table is excluded and we skip it
        else:
            logger.info("Table excluded from load: %s " %i)
except Exception as e:
    # upload error log to s3
    s3.upload_file(filepath + filename, s3_logbucket, s3_logprefix + filename)
    raise

基本上,该脚本会读取一个 json cfg 文件,其中包含一个由 YYYYMMDD 或 YYYYMMDDhhmmss 分区的外部表列表、RS 表和 RS 存储过程,它们将数据从 S3 加载到 RS。 当错误被捕获时,我不希望引发错误。或者更确切地说,我想在引发错误之前给它 3 次。我需要帮助编写那个迭代吗?

谢谢, 罗莎

【问题讨论】:

这能回答你的问题吗? Repeat Python function call on exception? 【参考方案1】:

如果您将重试策略设置为 3 次(重试尝试异步调用部分),当您引发异常时它将自动重试。如果您使用 SQS 或 Kinesis 触发 lambda 函数,它会确保 lambda 被重试。

如果你不需要走那条路,你可以简单地修改你的代码重试。

retries = 0
retry_limit = 3

while retries < retry_limit:
    try:
        # you code goes here
        break
    except Exception as e:
        # log the error
        retries += 1
        if retries == retry_limit:
            raise e

但是,我不建议这样做。原因是 lambda 的生命周期有限,手动重试会消耗掉这个生命周期。

所以,尝试取消第一个选项。

【讨论】:

感谢您的快速回复。代码通过 SQL Server 作业运行。它不是 Lambda。我要试试这个,然后告诉你结果。 啊,好吧,我没有意识到这是一个通用问题。然后别忘了加break

以上是关于Python在引发异常后添加重试的主要内容,如果未能解决你的问题,请参考以下文章

tenacity发生异常/失败/错误时重试retry机制,Python

在 Python 提示符处引发错误后如何获取最后一个异常对象?

如何防止重试sidekiq上的某些异常/错误

Python学习笔记之异常

Python重试包 - 韧性:如何记录异常的根本原因?

Python学习--异常