当第三方服务不可用时抑制异常的最佳方法?

2024-04-25 21:43:00 发布

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

我已经编写了一个Django应用程序,它通过Python包装器与第三方API交互(discus,尽管这个细节并不重要)。当服务不可用时,Python包装器将引发异常。在

应用程序处理此类异常的最佳方法是禁止这些异常,这样页面的其余内容仍然可以显示给用户。下面的方法很好。在

try:
    somemodule.method_that_may_raise_exception(args)
except somemodule.APIError:
    pass

某些视图包含几个这样的调用。在try/except中包装每个调用是否是抑制可能的异常的最佳方法?在


Tags: django方法用户api应用程序内容that页面
2条回答

从视图调用API不是一个好主意。你应该创建另一个模块。在

例如,当我制作Facebook应用程序时,我会创建publish.py文件来存储所有“发布到实时流”调用。该模块中的函数根据应调用的时间命名。即:

^{1}$

那么你的观点非常清晰:

^{pr2}$

以这种方式组织代码后,可以创建用于忽略异常的装饰器:

# publish.py
def ignore_api_error(fun):
    def res(*args, **kwargs):
        try:
            return fun(*args, **kwargs):
        except someservice.ApiError:
            return None
    return res

@ignore_api_error
def authorised_application(user):
    # API call "User joined app."

@ignore_api_error
def posted_anwser(user, anwser):
    # API call "User posted anwser to quiz".

您还可以创建默认情况下不“忽略”的函数,并在视图中添加忽略代码:

# publish.py
def some_function(user, message):
    pass

# views.py
def my_view():
    ...
    publish.ignore_api_error(publish.some_function)(user, message)
    ...

Certain views contain several such calls. Is wrapping each call in try/except the best way to suppress possible exceptions?

可以将API调用包装在另一个函数中。说:

^{1}$

可以调用此函数,而不是在每个视图中调用try/except块。这至少有助于减少您编写的代码行数,并为处理此类异常提供一个公共场所。在

更新

@Yorirou是对的。更改代码以添加此良好实践。在

相关问题 更多 >