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