Skip to main content
 首页 » 编程设计

python之重新路由 Django 的 "handle_uncaught_exception"

2025年05月04日29zhwl

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

我们使用自己的 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 的优点是它只在模板开始呈现时调用(我认为)。缺点似乎是我无法在要引发的 View 中捕获异常,比如 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") 

如果有任何关于尝试更早抛出此异常而无需加载整个结果集的想法,我将不胜感激。

请您参考如下方法:

由于这是在呈现模板时引发的异常,因此目前无法在 Django 1.3/1.4 中处理该异常。

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

请引用Django-developers google groups email thread了解更多详情。