记录错误¶
在 上一个示例 中,我们创建了一个服务器,它通过中止响应生成来处理响应错误,从而可能避免无用的工作。但是,它对任何错误都保持沉默。在本例中,我们将修改上一个示例,使其记录每个失败的响应。
本例将使用 Twisted API 记录错误。正如在 第一个介绍 Deferred 的示例 中提到的,errbacks 会传递一个错误。在上一个示例中,_responseFailed
errback 接受了这个错误作为参数,但忽略了它。本例与上例唯一的区别是,这个 _responseFailed
将使用该错误参数来记录一条消息。
本例需要上例中所需的所有导入,再加上一个新的导入
from twisted.python.log import err
上例中唯一改变的部分是 _responseFailed
回调,它现在将记录传递给它的错误
...
def _responseFailed(self, failure, call):
call.cancel()
err(failure, b"Async response demo interrupted response")
我们在这里向 err
传递了两个参数。第一个是传递给回调的错误。它始终是 Failure
类型的对象,这是一个表示异常和(有时,但并非总是)回溯的类。 err
将为日志格式化它。第二个参数是一个描述性字符串,它告诉阅读日志的人错误的来源是什么。
以下是包含上述两个修改的完整示例
from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor
from twisted.python.log import err
class DelayedResource(Resource):
def _delayedRender(self, request):
request.write(b"<html><body>Sorry to keep you waiting.</body></html>")
request.finish()
def _responseFailed(self, failure, call):
call.cancel()
err(failure, b"Async response demo interrupted response")
def render_GET(self, request):
call = reactor.callLater(5, self._delayedRender, request)
request.notifyFinish().addErrback(self._responseFailed, call)
return NOT_DONE_YET
resource = DelayedResource()
像在 上一个示例 中一样运行此服务器,并中断一个请求。与上一个示例不同,上一个示例没有给出任何发生这种情况的迹象,而在这个版本中,您将在日志输出中看到一条消息。