Python 抑制在第三方服务不可用时引发的异常的最佳方法?
我已经编写了一个Django应用程序,它通过Python包装器与第三方API(discus,尽管这个细节并不重要)交互。当服务不可用时,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
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调用的逻辑,这种方法可以减少所讨论视图的意大利面条式本质