首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以将异常作为参数传递给python中的函数吗?

我可以将异常作为参数传递给python中的函数吗?
EN

Stack Overflow用户
提问于 2013-08-07 11:12:26
回答 3查看 1.9K关注 0票数 5

我对蟒蛇很陌生。我正在尝试创建一个重试装饰器,当应用于函数时,它将继续重试,直到满足某些条件(为了简单起见,比如重试10次)。

代码语言:javascript
运行
复制
def retry():
    def wrapper(func):
        for i in range(0,10):
            try:
                func()
                break
            except:
               continue
    return wrapper

现在,这将在任何例外情况下重新尝试。如何更改它,使其重新尝试特定的异常。例如,我想把它当作:

代码语言:javascript
运行
复制
@retry(ValueError, AbcError)
def myfunc():
    //do something

我希望myfunc只被重试,只会抛出ValueErrorAbcError

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-07 11:18:13

您可以将异常的tuple提供给except ..块以捕获:

代码语言:javascript
运行
复制
from functools import wraps

def retry(*exceptions, **params):
    if not exceptions:
        exceptions = (Exception,)
    tries = params.get('tries', 10)

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kw):
            for i in range(tries):
                try:
                    return func(*args, **kw)
                except exceptions:
                    pass
        return wrapper
    return decorator

所有捕获的*exceptions参数总是会导致元组的。我还添加了一个tries关键字,因此您也可以配置重试次数:

代码语言:javascript
运行
复制
@retry(ValueError, TypeError, tries=20)
def foo():
    pass

演示:

代码语言:javascript
运行
复制
>>> @retry(NameError, tries=3)
... def foo():
...     print 'Futzing the foo!'
...     bar
... 
>>> foo()
Futzing the foo!
Futzing the foo!
Futzing the foo!
票数 10
EN

Stack Overflow用户

发布于 2013-08-07 11:22:51

代码语言:javascript
运行
复制
from functools import wraps

class retry(object):
    def __init__(self, *exceptions):
        self.exceptions = exceptions

    def __call__(self, f):
        @wraps(f) # required to save the original context of the wrapped function
        def wrapped(*args, **kwargs):
            for i in range(0,10):
                try:
                    f(*args, **kwargs)
                except self.exceptions:
                    continue
        return wrapped

用法:

代码语言:javascript
运行
复制
@retry(ValueError, Exception)
def f():
    print('In f')
    raise ValueError


>>> f()
In f
In f
In f
In f
In f
In f
In f
In f
In f
In f
票数 2
EN

Stack Overflow用户

发布于 2013-08-07 11:18:35

您可以检查错误类:

代码语言:javascript
运行
复制
except Exception as e:
    for et in error_types: #(or args)
        if isinstance(e, et):
            continue
    raise e #re-raise
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18101887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档