重新路由Django的“handle_uncaught_exception”

时间:2012-05-13 19:32:29

标签: python django exception-handling

有没有办法捕捉Django的handle_uncaught_exception并以某种方式通过视图重新路由错误?

我们为Django使用自己的数据库后端。后端的两个重要特性是我们使用数据库来引发我们希望渗透到前端的异常,并且我们使用namedtuples提供了一个懒惰的rowgetter。

当我使用惰性rowgetter时,我无法捕获自定义异常,我可以在执行标准查询时执行此操作。示例回溯如下:

ERROR Internal Server Error: /api/b-r-o-k-e-n--t-o-k-e-n/
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 136, in get_response
    response = response.render()
  ...lines removed...
  File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 144, in render
    values = list(values)
  File "../xmlapi/model/model.py", line 80, in xmlapi_get_location_rota
    for i in self.foldquery(query, args, slices):
  File "../xmlapi/model/db.py", line 168, in foldquery
    self.query(querystring, args)
  File "../xmlapi/model/db.py", line 44, in wrapped_fn
    raise DBException(e.message.strip())
DBException
Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
    self.result = application(self.environ, self.start_response)
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 241, in __call__
    response = self.get_response(request)
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 179, in get_response
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
 ...lines removed...

懒惰的rowgetter的优点是它只在模板开始渲染时调用(我认为)。缺点似乎是我无法在视图中捕获异常,例如420: rate limit exceeded错误。

由于评估较晚,因此不会调用错误处理程序:

    try:
        rota = self.model.xmlapi_get_location_rota (**kwargs)
    except DBException, e:
        code, message = [epart.strip() for epart in e.msg.split(':')]
        return HttpResponse(message, status=code,
                            content_type="text/plain")

对于尝试在不加载整个结果集的情况下尝试抛出此异常的任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

由于这是渲染模板时引发的异常,因此当前无法在Django 1.3 / 1.4中处理异常。

django-developers列表建议捕获TemplateResponse异常的能力应作为django功能请求添加。

有关详细信息,请参阅Django-developers google groups email thread