From f13b1ab184a0d660c2808bd32ec2db64d2f83bf0 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 24 Sep 2026 15:21:07 +0200 Subject: [PATCH 1/3] fix: Drop events if processor raises This reverts commit b499d89b689157385a1b85f6f9f8d5f845f40b9f. --- sentry_sdk/scope.py | 4 ++-- tests/test_basics.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 3081d95140..8519bc5263 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -1480,7 +1480,7 @@ def run_error_processors(self, event: "Event", hint: "Hint") -> "Optional[Event] ) for error_processor in error_processors: - new_event = event + new_event = None with capture_internal_exceptions(): new_event = error_processor(event, exc_info) if new_event is None: @@ -1510,7 +1510,7 @@ def run_event_processors(self, event: "Event", hint: "Hint") -> "Optional[Event] ) for event_processor in event_processors: - new_event = event + new_event = None with capture_internal_exceptions(): new_event = event_processor(event, hint) if new_event is None: diff --git a/tests/test_basics.py b/tests/test_basics.py index d746146baa..131895c8e7 100644 --- a/tests/test_basics.py +++ b/tests/test_basics.py @@ -661,6 +661,49 @@ def foo(event, hint): sentry_sdk.scope.global_event_processors = old_processors +@pytest.mark.tests_internal_exceptions +def test_event_processor_exception_drops_event_and_records_client_report( + sentry_init, capture_events, capture_record_lost_event_calls +): + sentry_init(default_integrations=False) + events = capture_events() + record_lost_event_calls = capture_record_lost_event_calls() + + scope = sentry_sdk.get_isolation_scope() + + @scope.add_event_processor + def bad_processor(event, hint): + raise ValueError("processor error") + + capture_message("should be dropped") + + assert len(events) == 0 + assert ("event_processor", "error", None, 1) in record_lost_event_calls + + +@pytest.mark.tests_internal_exceptions +def test_error_processor_exception_drops_event( + sentry_init, capture_events, capture_record_lost_event_calls +): + sentry_init(default_integrations=False) + events = capture_events() + record_lost_event_calls = capture_record_lost_event_calls() + + scope = sentry_sdk.get_isolation_scope() + + @scope.add_error_processor + def bad_error_processor(event, exc_info): + raise ValueError("error processor error") + + try: + raise ValueError("original error") + except Exception: + capture_exception() + + assert len(events) == 0 + assert ("event_processor", "error", None, 1) in record_lost_event_calls + + @pytest.mark.tests_internal_exceptions def test_before_send_exception_records_callback_error( sentry_init, capture_events, capture_record_lost_event_calls From 593af0ca6c47dfd8ef06f68152983ed970f915a9 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 24 Sep 2026 15:23:39 +0200 Subject: [PATCH 2/3] breadcrumbs, too --- sentry_sdk/scope.py | 2 +- tests/test_basics.py | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 8519bc5263..4f0830bf97 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -917,7 +917,7 @@ def add_breadcrumb( if crumb.get("type") is None: crumb["type"] = "default" - new_crumb = crumb + new_crumb = None if before_breadcrumb is not None: with capture_internal_exceptions(): new_crumb = before_breadcrumb(crumb, hint) diff --git a/tests/test_basics.py b/tests/test_basics.py index 131895c8e7..38861c4cf9 100644 --- a/tests/test_basics.py +++ b/tests/test_basics.py @@ -214,7 +214,7 @@ def do_this(): @pytest.mark.tests_internal_exceptions def test_option_before_breadcrumb_exception(sentry_init, capture_events): - """Exceptions in before_breadcrumb are contained.""" + """Breadcrumb is dropped if before_breadcrumb raises an exception.""" def before_breadcrumb(crumb, hint): 1 / 0 @@ -234,10 +234,7 @@ def do_this(): (event,) = events assert event["exception"]["values"][0]["type"] == "ValueError" - (crumb,) = event["breadcrumbs"]["values"] - assert "timestamp" in crumb - assert crumb["message"] == "Hello" - assert crumb["type"] == "default" + assert event["breadcrumbs"]["values"] == [] def test_breadcrumb_arguments(sentry_init, capture_events): From 21121d1b4e99b761a84fb3fd8165b93e168b2b5f Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 24 Sep 2026 16:11:07 +0200 Subject: [PATCH 3/3] fix --- sentry_sdk/scope.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 4f0830bf97..4a0fbcac28 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -917,8 +917,9 @@ def add_breadcrumb( if crumb.get("type") is None: crumb["type"] = "default" - new_crumb = None + new_crumb = crumb if before_breadcrumb is not None: + new_crumb = None with capture_internal_exceptions(): new_crumb = before_breadcrumb(crumb, hint)