forked from orbit-oss/flask
always pass InternalServerError instance to 500 handler
This commit is contained in:
parent
2fa30f6a9e
commit
9054f6d639
3 changed files with 146 additions and 11 deletions
|
|
@ -1811,11 +1811,36 @@ class Flask(_PackageBoundObject):
|
|||
return handler(e)
|
||||
|
||||
def handle_exception(self, e):
|
||||
"""Default exception handling that kicks in when an exception
|
||||
occurs that is not caught. In debug mode the exception will
|
||||
be re-raised immediately, otherwise it is logged and the handler
|
||||
for a 500 internal server error is used. If no such handler
|
||||
exists, a default 500 internal server error message is displayed.
|
||||
"""Handle an exception that did not have an error handler
|
||||
associated with it, or that was raised from an error handler.
|
||||
This always causes a 500 ``InternalServerError``.
|
||||
|
||||
Always sends the :data:`got_request_exception` signal.
|
||||
|
||||
If :attr:`propagate_exceptions` is ``True``, such as in debug
|
||||
mode, the error will be re-raised so that the debugger can
|
||||
display it. Otherwise, the original exception is logged, and
|
||||
an :exc:`~werkzeug.exceptions.InternalServerError` is returned.
|
||||
|
||||
If an error handler is registered for ``InternalServerError`` or
|
||||
``500``, it will be used. For consistency, the handler will
|
||||
always receive the ``InternalServerError``. The original
|
||||
unhandled exception is available as ``e.original_exception``.
|
||||
|
||||
.. note::
|
||||
Prior to Werkzeug 1.0.0, ``InternalServerError`` will not
|
||||
always have a ``original_exception`` attribute. Use
|
||||
``getattr(e, "original_exception", None)`` to simulate the
|
||||
behavior for compatibility.
|
||||
|
||||
.. versionchanged:: 1.1.0
|
||||
Always passes the ``InternalServerError`` instance to the
|
||||
handler, setting ``original_exception`` to the unhandled
|
||||
error.
|
||||
|
||||
.. versionchanged:: 1.1.0
|
||||
``after_request`` functions and other finalization is done
|
||||
even for the default 500 response when there is no handler.
|
||||
|
||||
.. versionadded:: 0.3
|
||||
"""
|
||||
|
|
@ -1833,10 +1858,16 @@ class Flask(_PackageBoundObject):
|
|||
raise e
|
||||
|
||||
self.log_exception((exc_type, exc_value, tb))
|
||||
handler = self._find_error_handler(InternalServerError())
|
||||
if handler is None:
|
||||
return InternalServerError()
|
||||
return self.finalize_request(handler(e), from_error_handler=True)
|
||||
server_error = InternalServerError()
|
||||
# TODO: pass as param when Werkzeug>=1.0.0 is required
|
||||
# TODO: also remove note about this from docstring and docs
|
||||
server_error.original_exception = e
|
||||
handler = self._find_error_handler(server_error)
|
||||
|
||||
if handler is not None:
|
||||
server_error = handler(server_error)
|
||||
|
||||
return self.finalize_request(server_error, from_error_handler=True)
|
||||
|
||||
def log_exception(self, exc_info):
|
||||
"""Logs an exception. This is called by :meth:`handle_exception`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue