Merge pull request #255 from seemethere/add_more_verbose_debug_error_handling
Add more verbose debug error handling
This commit is contained in:
commit
0675f388b9
|
@ -1,4 +1,5 @@
|
||||||
from .response import text
|
from .response import text
|
||||||
|
from .log import log
|
||||||
from traceback import format_exc
|
from traceback import format_exc
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,18 +57,31 @@ class Handler:
|
||||||
:return: Response object
|
:return: Response object
|
||||||
"""
|
"""
|
||||||
handler = self.handlers.get(type(exception), self.default)
|
handler = self.handlers.get(type(exception), self.default)
|
||||||
response = handler(request=request, exception=exception)
|
try:
|
||||||
|
response = handler(request=request, exception=exception)
|
||||||
|
except:
|
||||||
|
if self.sanic.debug:
|
||||||
|
response_message = (
|
||||||
|
'Exception raised in exception handler "{}" '
|
||||||
|
'for uri: "{}"\n{}').format(
|
||||||
|
handler.__name__, request.url, format_exc())
|
||||||
|
log.error(response_message)
|
||||||
|
return text(response_message, 500)
|
||||||
|
else:
|
||||||
|
return text('An error occurred while handling an error', 500)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def default(self, request, exception):
|
def default(self, request, exception):
|
||||||
if issubclass(type(exception), SanicException):
|
if issubclass(type(exception), SanicException):
|
||||||
return text(
|
return text(
|
||||||
"Error: {}".format(exception),
|
'Error: {}'.format(exception),
|
||||||
status=getattr(exception, 'status_code', 500))
|
status=getattr(exception, 'status_code', 500))
|
||||||
elif self.sanic.debug:
|
elif self.sanic.debug:
|
||||||
return text(
|
response_message = (
|
||||||
"Error: {}\nException: {}".format(
|
'Exception occurred while handling uri: "{}"\n{}'.format(
|
||||||
exception, format_exc()), status=500)
|
request.url, format_exc()))
|
||||||
|
log.error(response_message)
|
||||||
|
return text(response_message, status=500)
|
||||||
else:
|
else:
|
||||||
return text(
|
return text(
|
||||||
"An error occurred while generating the request", status=500)
|
'An error occurred while generating the response', status=500)
|
||||||
|
|
|
@ -1,51 +1,86 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
from sanic import Sanic
|
from sanic import Sanic
|
||||||
from sanic.response import text
|
from sanic.response import text
|
||||||
from sanic.exceptions import InvalidUsage, ServerError, NotFound
|
from sanic.exceptions import InvalidUsage, ServerError, NotFound
|
||||||
from sanic.utils import sanic_endpoint_test
|
from sanic.utils import sanic_endpoint_test
|
||||||
|
|
||||||
# ------------------------------------------------------------ #
|
|
||||||
# GET
|
|
||||||
# ------------------------------------------------------------ #
|
|
||||||
|
|
||||||
exception_app = Sanic('test_exceptions')
|
class SanicExceptionTestException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@exception_app.route('/')
|
@pytest.fixture(scope='module')
|
||||||
def handler(request):
|
def exception_app():
|
||||||
return text('OK')
|
app = Sanic('test_exceptions')
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def handler(request):
|
||||||
|
return text('OK')
|
||||||
|
|
||||||
|
@app.route('/error')
|
||||||
|
def handler_error(request):
|
||||||
|
raise ServerError("OK")
|
||||||
|
|
||||||
|
@app.route('/404')
|
||||||
|
def handler_404(request):
|
||||||
|
raise NotFound("OK")
|
||||||
|
|
||||||
|
@app.route('/invalid')
|
||||||
|
def handler_invalid(request):
|
||||||
|
raise InvalidUsage("OK")
|
||||||
|
|
||||||
|
@app.route('/divide_by_zero')
|
||||||
|
def handle_unhandled_exception(request):
|
||||||
|
1 / 0
|
||||||
|
|
||||||
|
@app.route('/error_in_error_handler_handler')
|
||||||
|
def custom_error_handler(request):
|
||||||
|
raise SanicExceptionTestException('Dummy message!')
|
||||||
|
|
||||||
|
@app.exception(SanicExceptionTestException)
|
||||||
|
def error_in_error_handler_handler(request, exception):
|
||||||
|
1 / 0
|
||||||
|
|
||||||
|
return app
|
||||||
|
|
||||||
|
|
||||||
@exception_app.route('/error')
|
def test_no_exception(exception_app):
|
||||||
def handler_error(request):
|
"""Test that a route works without an exception"""
|
||||||
raise ServerError("OK")
|
|
||||||
|
|
||||||
|
|
||||||
@exception_app.route('/404')
|
|
||||||
def handler_404(request):
|
|
||||||
raise NotFound("OK")
|
|
||||||
|
|
||||||
|
|
||||||
@exception_app.route('/invalid')
|
|
||||||
def handler_invalid(request):
|
|
||||||
raise InvalidUsage("OK")
|
|
||||||
|
|
||||||
|
|
||||||
def test_no_exception():
|
|
||||||
request, response = sanic_endpoint_test(exception_app)
|
request, response = sanic_endpoint_test(exception_app)
|
||||||
assert response.status == 200
|
assert response.status == 200
|
||||||
assert response.text == 'OK'
|
assert response.text == 'OK'
|
||||||
|
|
||||||
|
|
||||||
def test_server_error_exception():
|
def test_server_error_exception(exception_app):
|
||||||
|
"""Test the built-in ServerError exception works"""
|
||||||
request, response = sanic_endpoint_test(exception_app, uri='/error')
|
request, response = sanic_endpoint_test(exception_app, uri='/error')
|
||||||
assert response.status == 500
|
assert response.status == 500
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_usage_exception():
|
def test_invalid_usage_exception(exception_app):
|
||||||
|
"""Test the built-in InvalidUsage exception works"""
|
||||||
request, response = sanic_endpoint_test(exception_app, uri='/invalid')
|
request, response = sanic_endpoint_test(exception_app, uri='/invalid')
|
||||||
assert response.status == 400
|
assert response.status == 400
|
||||||
|
|
||||||
|
|
||||||
def test_not_found_exception():
|
def test_not_found_exception(exception_app):
|
||||||
|
"""Test the built-in NotFound exception works"""
|
||||||
request, response = sanic_endpoint_test(exception_app, uri='/404')
|
request, response = sanic_endpoint_test(exception_app, uri='/404')
|
||||||
assert response.status == 404
|
assert response.status == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_handled_unhandled_exception(exception_app):
|
||||||
|
"""Test that an exception not built into sanic is handled"""
|
||||||
|
request, response = sanic_endpoint_test(
|
||||||
|
exception_app, uri='/divide_by_zero')
|
||||||
|
assert response.status == 500
|
||||||
|
assert response.body == b'An error occurred while generating the response'
|
||||||
|
|
||||||
|
|
||||||
|
def test_exception_in_exception_handler(exception_app):
|
||||||
|
"""Test that an exception thrown in an error handler is handled"""
|
||||||
|
request, response = sanic_endpoint_test(
|
||||||
|
exception_app, uri='/error_in_error_handler_handler')
|
||||||
|
assert response.status == 500
|
||||||
|
assert response.body == b'An error occurred while handling an error'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user