From 25d07debba5d8a4cfa06ca90d7055843caaac013 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Fri, 7 Aug 2026 11:19:48 +0200 Subject: [PATCH] fix: Do not let exceptions in before_breadcrumb bubble up --- sentry_sdk/scope.py | 6 +++--- tests/test_basics.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 09e8876d6d..09c580defa 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -1090,10 +1090,10 @@ def add_breadcrumb( if crumb.get("type") is None: crumb["type"] = "default" + new_crumb = crumb if before_breadcrumb is not None: - new_crumb = before_breadcrumb(crumb, hint) - else: - new_crumb = crumb + with capture_internal_exceptions(): + new_crumb = before_breadcrumb(crumb, hint) if new_crumb is not None: self._breadcrumbs.append(new_crumb) diff --git a/tests/test_basics.py b/tests/test_basics.py index db1a028c45..2d7dfc4a68 100644 --- a/tests/test_basics.py +++ b/tests/test_basics.py @@ -250,6 +250,34 @@ def do_this(): assert crumb["type"] == "default" +@pytest.mark.tests_internal_exceptions +def test_option_before_breadcrumb_exception(sentry_init, capture_events): + """Exceptions in before_breadcrumb are contained.""" + + def before_breadcrumb(crumb, hint): + 1 / 0 + + sentry_init(before_breadcrumb=before_breadcrumb) + events = capture_events() + + def do_this(): + add_breadcrumb(message="Hello", hint={"foo": 42}) + try: + raise ValueError("aha!") + except Exception: + capture_exception() + + 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" + + @pytest.mark.parametrize( "enable_tracing, traces_sample_rate, tracing_enabled, updated_traces_sample_rate", [