app/soc/middleware/exception_handler.py
author Sverre Rabbelier <srabbelier@gmail.com>
Sat, 12 Sep 2009 14:42:37 +0200
changeset 2906 6fb53ed7aff4
parent 2901 6c8ba67289a6
permissions -rw-r--r--
Add docstring to middleware hooks
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2901
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/python2.5
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     2
#
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     3
# Copyright 2009 the Melange authors.
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     4
#
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     8
#
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     9
#   http://www.apache.org/licenses/LICENSE-2.0
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    10
#
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    15
# limitations under the License.
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    16
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    17
"""Middleware to handle exceptions.
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    18
"""
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    19
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    20
__authors__ = [
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    21
  '"Sverre Rabbelier" <sverre@rabbelier.nl>',
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    22
  ]
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    23
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    24
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    25
import logging
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    26
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    27
from google.appengine.runtime import DeadlineExceededError
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    28
from google.appengine.runtime.apiproxy_errors import CapabilityDisabledError
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    29
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    30
from django import http
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    32
from soc.views.helper import responses
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    33
from soc.views import out_of_band
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    34
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    35
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    36
class ExceptionHandlerMiddleware(object):
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    37
  """Middleware class to handle exceptions..
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
  """
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    39
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    40
  def process_exception(self, request, exception):
2906
6fb53ed7aff4 Add docstring to middleware hooks
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2901
diff changeset
    41
    """Called when an uncaught exception is raised.
6fb53ed7aff4 Add docstring to middleware hooks
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2901
diff changeset
    42
6fb53ed7aff4 Add docstring to middleware hooks
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2901
diff changeset
    43
    See the Django middleware documentation for an explanation of
6fb53ed7aff4 Add docstring to middleware hooks
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2901
diff changeset
    44
    the method signature.
6fb53ed7aff4 Add docstring to middleware hooks
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2901
diff changeset
    45
    """
6fb53ed7aff4 Add docstring to middleware hooks
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2901
diff changeset
    46
2901
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    47
    template = None
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    48
    context = responses.getUniversalContext(request)
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    49
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    50
    if isinstance(exception, DeadlineExceededError):
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    51
      template = 'soc/deadline_exceeded.html'
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    52
    if isinstance(exception, MemoryError):
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    53
      template = 'soc/memory_error.html'
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    54
    if isinstance(exception, AssertionError):
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    55
      template = 'soc/assertion_error.html'
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    56
    if isinstance(exception, out_of_band.Error):
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    57
      return responses.errorResponse(error, request)
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    58
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    59
    if template:
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    60
      logging.exception(exception)
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    61
      return responses.respond(request, template, context=context)
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    62
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    63
    # let Django handle it
6c8ba67289a6 Add ExceptionHandlerMiddleware
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    64
    return None