Merge pull request #255 from seemethere/add_more_verbose_debug_error_handling

Add more verbose debug error handling
This commit is contained in:
Eli Uriegas 2017-01-03 15:43:26 -06:00 committed by GitHub
commit 0675f388b9
2 changed files with 81 additions and 32 deletions

View File

@ -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)
try:
response = handler(request=request, exception=exception) 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)

View File

@ -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():
app = Sanic('test_exceptions')
@app.route('/')
def handler(request):
return text('OK') return text('OK')
@app.route('/error')
@exception_app.route('/error') def handler_error(request):
def handler_error(request):
raise ServerError("OK") raise ServerError("OK")
@app.route('/404')
@exception_app.route('/404') def handler_404(request):
def handler_404(request):
raise NotFound("OK") raise NotFound("OK")
@app.route('/invalid')
@exception_app.route('/invalid') def handler_invalid(request):
def handler_invalid(request):
raise InvalidUsage("OK") raise InvalidUsage("OK")
@app.route('/divide_by_zero')
def handle_unhandled_exception(request):
1 / 0
def test_no_exception(): @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
def test_no_exception(exception_app):
"""Test that a route works without an 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'