Skip to content

Feature Request: Expose Handling Frame Information in Python's Traceback Module #126935

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
vanschelven opened this issue Nov 17, 2024 · 2 comments
Labels
stdlib Python modules in the Lib dir type-feature A feature request or enhancement

Comments

@vanschelven
Copy link

vanschelven commented Nov 17, 2024

Feature or enhancement

Proposal:

Problem: When dealing with chained exceptions in Python, there is no straightforward way to identify the "outermost handling frame": the frame in the except/finally block that starts the part of the stacktrace that's unique to the "during the handling" exception.

This information is not visible in the textual stacktrace, nor is it accessible programmatically via Python's traceback module (or similar tools).

Since this "handling frame" represents half of the link between 2 exceptions when shown in "chained mode", the fact that this information is missing makes it very hard to see how 2 chained exceptions actually relate to each other.

Proposal: Extend Python's traceback-related modules (e.g., traceback, sys.exc_info) to expose handling frame information. This would allow developers and tools to programmatically determine where exceptions are caught and re-raised in the call stack.

(It would seem to me that just changing the underlying datastructures leads to the least disruption in peoples' workflow, while still allowing for some users to extract the information if they need it)

Current Behavior:

Using the following example:

class OriginalException(Exception):
    pass

class AnotherException(Exception):
    pass

def raise_another_exception():
    raise AnotherException()

def show_something():
    try:
        raise OriginalException()
    except OriginalException:
        raise_another_exception()

show_something()

Running this code produces:

Traceback (most recent call last):
  File "example.py", line 15, in show_something
    raise OriginalException()
__main__.OriginalException

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "example.py", line 20, in <module>
    show_something()
  File "example.py", line 17, in show_something
    raise_another_exception()
  File "example.py", line 10, in raise_another_exception
    raise AnotherException()
__main__.AnotherException

In this traceback, line 17 (raise_another_exception()) is the handling frame, but there is no direct way to programmatically extract this information.

Proposed Improvement:

Enhance the traceback-related API(s) to expose handling frame information.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

I wrote extensively about this problem (as well as more generally about how confusing chained stacktraces can be) on my blog.

This is obviously not actually a discussion since it doesn't involve other people, but I do think it's useful context (and it's better to keep the longer story out of the feature-request)

Linked PRs

@vanschelven vanschelven added the type-feature A feature request or enhancement label Nov 17, 2024
@picnixz
Copy link
Member

picnixz commented Nov 17, 2024

I think you should open a Discourse (https://discuss.python.org/c/ideas/6) post for this feature that seems non-trivial to implement. If you want a discussion, this is the place to go!

@picnixz picnixz added stdlib Python modules in the Lib dir pending The issue will be closed if no feedback is provided labels Nov 17, 2024
@ZeroIntensity
Copy link
Member

I like the idea, but yeah, this needs to get approved and bikeshedded on DPO first. Let’s leave this issue open in the meantime, though.

@picnixz picnixz removed the pending The issue will be closed if no feedback is provided label Nov 18, 2024
blhsing added a commit to blhsing/cpython that referenced this issue Nov 19, 2024
vanschelven added a commit to vanschelven/sentry-python that referenced this issue Nov 19, 2024
blhsing added a commit to blhsing/cpython that referenced this issue Nov 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stdlib Python modules in the Lib dir type-feature A feature request or enhancement
Projects
None yet
Development

No branches or pull requests

3 participants