Django process_view中间件:如何处理视图中的异常

时间:2013-05-01 07:52:59

标签: django

我正试图围绕process_view的正确,可行的实现。我们的想法是在process_view中调用视图函数。我的问题主要是如何处理视图函数中的异常。

我的理解是,中间件函数可能永远不会引发异常,因此必须捕获视图函数可能抛出的所有异常。这种理解在实践中确实得到了证实:如果我没有捕获异常,Django的基本处理程序将跳过任何process_exception调用。但是,如果我确实捕获了异常,则视图函数将被调用两次(一次由我的中间件调用,并且再一次由基本处理程序调用以尝试运行异常,因此它可以由各种中间件{{1}处理})。在下面的snipplet中,第一个电话在process_exception,第二个电话在response = middleware_method(...

Django 1.4的django / core / handlers / base.py:

response = callback(...

为了更加清晰,这是我的中间件:

    # Apply view middleware
    for middleware_method in self._view_middleware:
        response = middleware_method(request, callback, callback_args, callback_kwargs)
        if response:
            break

if response is None:
    try:
        response = callback(request, *callback_args, **callback_kwargs)
    except Exception, e:
        # If the view raised an exception, run it through exception
        # middleware, and if the exception middleware returns a
        # response, use that. Otherwise, reraise the exception.
        for middleware_method in self._exception_middleware:
            response = middleware_method(request, e)
            if response:
                break
        if response is None:
            raise

0 个答案:

没有答案