代码之家  ›  专栏  ›  技术社区  ›  davidchambers

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

  •  3
  • davidchambers  · 技术社区  · 14 年前

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

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Tomasz Wysocki    14 年前

    从视图进行API调用并不是一个好主意。您可能应该创建另一个模块来完成此任务。

    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)
        ...
    
        2
  •  1
  •   Manoj Govindan    14 年前

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

    def make_api_call(*args, **kwargs):
        try:
            return somemodule.method_that_may_raise_exception(*args, **kwargs)
        except somemodule.APIError:
            log.warn("....")           
    

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

    @你说得对。更改代码以添加此良好实践。