Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 抑制在第三方服务不可用时引发的异常的最佳方法?_Python_Django_Exception Handling - Fatal编程技术网

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

Python 抑制在第三方服务不可用时引发的异常的最佳方法?,python,django,exception-handling,Python,Django,Exception Handling,我已经编写了一个Django应用程序,它通过Python包装器与第三方API(discus,尽管这个细节并不重要)交互。当服务不可用时,Python包装器会引发异常 应用程序处理此类异常的最佳方法是抑制它们,以便页面的其余内容仍然可以显示给用户。下面的操作很好 try: somemodule.method_that_may_raise_exception(args) except somemodule.APIError: pass 某些视图包含几个这样的调用。在try/exce

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

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

try:
    somemodule.method_that_may_raise_exception(args)
except somemodule.APIError:
    pass
某些视图包含几个这样的调用。在try/except中包装每个调用是否是抑制可能异常的最佳方法

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

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

def make_api_call(*args, **kwargs):
    try:
        return somemodule.method_that_may_raise_exception(*args, **kwargs)
    except somemodule.APIError:
        log.warn("....")           
可以在每个视图中调用此函数,而不是调用
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)
    ...

默认忽略异常通常是个坏主意。你应该把这个例外记录下来。好的建议,Yorirou。此时,应用程序以调试模式登录到控制台;其余时间应用程序应将这些消息输出到日志文件。我在办这个案子!关于
ignore\u api\u错误
decorator,我有一个疑问。OP说,即使API调用失败,视图的其余部分也应该清晰地呈现(抑制它们,以便页面的其余内容仍然可以显示给用户)。给定此装饰器,API异常将导致视图返回
None
,这不是OP想要的。这不是视图的装饰器,而是API函数的装饰器。请再看一次我的帖子(我添加了评论以便更清楚)。谢谢,Manoj。通过封装围绕API调用的逻辑,这种方法可以减少所讨论视图的意大利面条式本质