首页 文章

异常处理装饰器,它接受 args 作为函数

提问于
浏览
2

我有一个异常处理装饰器,看起来像这样:

def error_handler(errors=(Exception, ), default=""):
    def funcator(func):
        def deep_inside(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except errors as e:
                print("i just cought a", repr(e))
                return default
        return deep_inside
    return funcator

这是一个示例用法:

date_error_handler = error_handler((ValueError), default="INVALID")

from dateutil import parser

@date_error_handler
def date_parser(date):
    return parser.parse(date)

现在,如果我通过这样的事情:

date_parser("12/10/1O")

我会得到这样的输出:

#output: 

i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'

而不是返回"INVALID"我想将一个函数作为参数传递给default(在error_handler装饰器中),它将获取日期字符串并尝试替换其中是否存在带数字的字母。例如它看起来像这样:

#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")

现在我需要将这个alpha_to_num作为参数传递给error_handlerdefault param。

这是预期输出和使用的示例:

这是一个示例用法:

from dateutil import parser

@error_handler((ValueError), default=alpha_to_num)
def date_parser(date):
    return parser.parse(date)

但现在我想获得这样的输出:

#expected output: 

i just cought a ValueError('Unknown string format:', '12/1O/10')
'12/10/10'

我该怎么办?

1 回答

  • 0

    您正在返回该函数而不是调用该函数。使用下面的代码。

    编辑:如果未传递或传递函数值,则添加处理值不是函数。

    def error_handler(errors=(Exception, ), default=""):
        def funcator(func):
            def deep_inside(*args, **kwargs):
                try:
                    return func(*args, **kwargs)
                except errors as e:
                    print("i just cought a", repr(e))
                    return default(*args, **kwargs) if hasattr(default,'__call__') else default
            return deep_inside
        return funcator
    

相关问题