gpt4 book ai didi

python - 如果抛出异常,如何再次调用 try block 中的代码?

转载 作者:行者123 更新时间:2023-11-28 20:42:33 24 4
gpt4 key购买 nike

我是 python 的新手,我正在编写使用 OAuth 进行身份验证的代码,当 token 在 60 分钟后过期时,它需要获取一个新的。

try:
if uploadedContent is not None:
thing.action(uploadedContent)

except LoginOrScopeRequired:
print("Logging in...")
set_access_credentials({"identity", "submit"}, get_access_token())

我目前有这段代码来处理在新 token 过期时获取新 token ,但问题是如果出现异常,它会跳过它需要执行的操作。我知道我可以获取 try block 中的内容并将其附加到 except block 的末尾,但是否有更优雅的方法来做到这一点?

我的一些研究导致了 with 语句,但我对 with 的理解不够好,不知道它是否能解决我的问题。那么将它附加到最后是最好的解决方案还是有更好的方法?

最佳答案

使用函数装饰器/包装器来执行此操作被认为是 Python 惯用语:

示例:

#!/usr/bin/env python


from functools import wraps


def retry_on_error(ntries=1):
"""
A decorator that returns a wrapper function that calls
the wrapped function repeatedly up to ntries if an
exception is encountered.
"""

def decorator(f): # wrapping the original function
@wraps(f) # make the wrapped function look like the original
def wrapper(*args, **kwargs): # our function wrapped that calls the original
for i in xrange(ntries):
try:
return f(*args, **kwargs)
except Exception as e:
print("Error executing {0:s} retrying {1:d}/{2:d}".format(f.__name__, i, ntries))
print("Error was {0:s}".format(e))

return wrapper

return decorator # returning the new wrapped function


@retry_on_error()
def f():
n = getattr(f, "n", 0)
try:
if not n:
raise ValueError("n < 0")
finally:
setattr(f, "n", n + 1)

输出:

$ python -i foo.py
>>> f()
Error executing f retrying 0/1
Error was n < 0
>>> f()
>>>

参见:Python Decorators其他例子。

更新:还有一个不错的库可以实现此功能并增加一些特性:retrying以及其他几个相关/类似的问题How to retry after exception in python?Pythonic way of retry running a function

更新 #2: 我对装饰器做了一些评论,希望您能理解该过程的每个步骤中发生了什么。诚然,装饰器一开始并不那么容易理解,所以我建议您阅读 Understanding Python Decorators in 12 easy step

关于python - 如果抛出异常,如何再次调用 try block 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com