diff --git a/sentry_sdk/integrations/sanic.py b/sentry_sdk/integrations/sanic.py index 25fc5de989..6d605669f7 100644 --- a/sentry_sdk/integrations/sanic.py +++ b/sentry_sdk/integrations/sanic.py @@ -68,10 +68,10 @@ def sentry_router_get(self, request): old_error_handler_lookup = ErrorHandler.lookup def sentry_error_handler_lookup(self, exception): - _capture_exception(exception) old_error_handler = old_error_handler_lookup(self, exception) if old_error_handler is None: + _capture_exception(exception) return None if Hub.current.get_integration(SanicIntegration) is None: diff --git a/tests/integrations/sanic/test_sanic.py b/tests/integrations/sanic/test_sanic.py index cc568a6110..f399637af2 100644 --- a/tests/integrations/sanic/test_sanic.py +++ b/tests/integrations/sanic/test_sanic.py @@ -7,7 +7,7 @@ from sentry_sdk.integrations.sanic import SanicIntegration from sanic import Sanic, request, response - +from sanic.exceptions import InvalidUsage @pytest.fixture def app(): @@ -88,17 +88,70 @@ def myhandler(request, exception): request, response = app.test_client.get("/error") assert response.status == 500 - event1, event2 = events + assert len(events) == 1 + + exception, = events[0]["exception"]["values"] + assert exception["type"] == "ZeroDivisionError" + assert any( + frame["filename"].endswith("test_sanic.py") + for frame in exception["stacktrace"]["frames"] + ) + + +def test_events_errorhandler_present(sentry_init, app, capture_events): + sentry_init(integrations=[SanicIntegration()]) + events = capture_events() + + @app.websocket("/error") + def myerror(request, websocket): + return response.json({}) + + @app.exception(InvalidUsage) + def myhandler(request, exception): + return response.json({}, 400) - exception, = event1["exception"]["values"] + request, r = app.test_client.get("/error") + assert r.status == 400 + + assert not events + + +def test_events_errorhandler_absent(sentry_init, app, capture_events): + sentry_init(integrations=[SanicIntegration()]) + events = capture_events() + + @app.route("/error") + def myerror(request): + raise ValueError('oh no') + + request, r = app.test_client.get("/error") + assert r.status == 500 + + assert len(events) == 1 + + exception, = events[0]["exception"]["values"] assert exception["type"] == "ValueError" assert any( frame["filename"].endswith("test_sanic.py") for frame in exception["stacktrace"]["frames"] ) - exception, = event2["exception"]["values"] - assert exception["type"] == "ZeroDivisionError" + +def test_events_errorhandler_absent_sanic_error(sentry_init, app, capture_events): + sentry_init(integrations=[SanicIntegration()]) + events = capture_events() + + @app.route("/error") + def myerror(request): + raise InvalidUsage('oh no') + + request, r = app.test_client.get("/error") + assert r.status == 400 + + assert len(events) == 1 + + exception, = events[0]["exception"]["values"] + assert exception["type"] == "InvalidUsage" assert any( frame["filename"].endswith("test_sanic.py") for frame in exception["stacktrace"]["frames"]