Python:有没有强制父函数返回的方法?

2024-10-01 07:48:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的程序中,我有一个处理requests调用的函数,它要么返回已处理的调用,要么引发异常。这个函数被许多其他函数使用,但是,我遇到的问题是如何处理可能引发的异常。目前设置如下(简化):

def getFromAPI(url):
    # create variable headers
    r = requests.get(url, headers=headers)
    if r.status_code == 404:
        raise Exception("Error raised")
    else:
        #process data
        return data

def functionone():
    ...
    try:
        data = getFromAPI(url)
    except Exception as e:
        return handleException(e) 
        #handles problems, returns exception-formatted data

    ...
    # formatting data specific to functionone
    return formatted_data

def functiontwo():
    ...
    try:
        data = getFromAPI(url)
    except Exception as e:
        return handleException(e) 
        #handles problems, returns exception-formatted data

    ...
    # formatting data specific to functiontwo
    return formatted_data

def functionthree():
    ...
    #similar to functionone and functiontwo

虽然我不认为这是错误的,但是由于getFromAPI在很多函数中都被使用,因此必须不断地重复try except语句会让人觉得不正确,好像应该在函数getFromAPI中处理它。但是,由于另一个functiononefunction_n都根据是否引发了错误而返回不同的结果,所以我看不到从getFromAPI内部处理该问题的方法,除非getFromAPI没有在父函数中显式调用return而强制其父函数返回。在

如果做不到这一点,是有更好的实现我正在尝试做的,还是我注定要重复try except语句?在


Tags: to函数urldatareturndefexceptionrequests
1条回答
网友
1楼 · 发布于 2024-10-01 07:48:31

写一个这样的装饰师

def catchAPIException(func):
    def wrapper(*args, **kwargs)
        try:
            return func(*args, **kwargs)
        except getFromAPIException as e:
            return handleException(e)
    return wrapper

那么你的functionone等看起来就像

^{pr2}$

但是您希望引发一个非常具体的自定义异常,这样您的装饰器将捕获相关的异常。或者您应该创建一些不同的异常,这些异常可以用不同的方法处理。在

如果不同的函数希望以自定义方式格式化异常,则可以向decorator传递另一个实际用于格式化异常的函数。一、 使handleException成为catchAPIException的参数

def catchAPIException(exceptionHandler = handleException):
    def real_decorator(func):
        def wrapper(*args, **kwargs)
            try:
                return func(*args, **kwargs)
            except getFromAPIException as e:
                return exceptionHandler(e)
        return wrapper
    return real_decorator

然后使用默认异常处理程序的函数声明如下:

@catchAPIException
def function1():
    ...

其他有更具体需求的人可以这样做:

def customExceptionHandler(e):
    ...

@catchAPIException(customExceptionHandler)
def function2():
    ...

如果您不熟悉decorator,这里有一个reasonable tutorial和Python文档,尽管它们没有显式的部分。在

相关问题 更多 >