Skip to content

Conversation

Zac-HD
Copy link
Contributor

@Zac-HD Zac-HD commented Aug 29, 2025

Thanks in particular to @.iritkatriel for great feedback on Discourse, and @.gpshead for discussions over lunch.

This update makes a moderate change to the proposed BaseExceptionGroup.leaf_exceptions() method, to return a list of (exc, traceback) tuples rather than accepting a boolean flag to call .with_traceback() for the user, and to specify that each sub-exception must be processed only once (in rare cases where a group is not tree-structured).

The larger change is to scrap my proposed BaseException.preserve_context() method: since I'd only (but always) recommend using it in the specific case of re-raising part of the exception group rendered by an except* statement, I now propose that we make a small language change to 'do the right thing' there unconditionally.

Discuss thread here.


📚 Documentation preview 📚: https://pep-previews--4568.org.readthedocs.build/

@Zac-HD Zac-HD requested review from njsmith and gpshead as code owners August 29, 2025 23:04
@Zac-HD Zac-HD force-pushed the zac-pep-updates branch 2 times, most recently from bd8a97f to e5f4baf Compare August 29, 2025 23:15
raise

However, this innocent-seeming code has a problem: ``raise first`` will do
``first.__context__ = group`` as a side effect. This discards the original
In this case, the implicit ``exc.__context__ = group`` discards the original
context of the error, which may contain crucial information to understand why
the exception was raised. In many production apps it also causes tracebacks
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

leaf_exceptions() loses the __context__ of all ExceptionGroups on the path from the leaf to the root. Here you're fixing it only for the last __context__, but that's not enough.

with the ``.split()`` and ``.subgroup()`` methods, and mentioning
``.preserve_context()`` as an advanced option to address specific pain points.
with the ``.split()`` and ``.subgroup()`` methods, emphasizing a preference
for the latter.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need leaf_exceptions()? What can that do that .split() and .subgroup() cannot?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants