编程语言
首页 > 编程语言> > python-抑制第三方服务不可用时引发异常的最佳方法?

python-抑制第三方服务不可用时引发异常的最佳方法?

作者:互联网

我编写了一个Django应用程序,该应用程序通过Python包装器与第三方API(Disqus,尽管此细节并不重要)进行交互.当服务不可用时,Python包装器将引发异常.

应用程序处理此类异常的最佳方法是抑制它们,以便仍可以向用户显示页面的其余内容.以下工作正常.

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

某些视图包含多个此类调用.是否将每个调用都包装在try / except中,以抑制可能的异常的最佳方法?

解决方法:

从视图进行API调用不是一个好主意.你或许应该创建另一个模块,完成该工作.

即.当我提出的Facebook应用程序创建publish.py文件来存储所有“发布到实况流”的电话.该模块中的函数根据何时调用而命名.即:

# publish.py
def authorise_application(user):
    # API call "User joined app."

def post_anwser(anwser):
    # API call "User posted anwser to quiz".

然后你的意见非常干净:

# views.py
def post_anwser(request):
    ...
    if form.is_valid():
        form.save()
        publish.post_anwser(form.instance)

当你有你的代码组织这样,您可以创建忽略例外装饰:

# 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)
    ...

标签:exception-handling,python,django
来源: https://codeday.me/bug/20191209/2096728.html