Skip to content

Support Exception-like Objects (TracebackException) For exc.__cause__ and exc.__context__ #111921

Description

@ericsnowcurrently

Feature or enhancement

Currently __cause__ and __context__ are expected to be exception objects (i.e. instances of BaseException). 1 We don't always enforce this expectation, but we definitely do in some places.

Proposal

I'd like to allow them to be non-exception objects, as long as the objects look like exceptions. My own interest is that I be able to set either attribute to traceback.TracebackException objects specifically. However, I expect that supporting them would in practice mean supporting any object that matches the appropriate drop-in-replacement interface. [^2]

[^2] See gh-111917.

Note that I am not suggesting that we be able to use such drop-in-replacements anywhere the runtime expects exception objects. You couldn't start raising TracebackException objects nor catch them I don't have any motivating case for any of that. I'm only suggesting support in __cause__ and __context__.

drop-in-replacement for exception objects

The idea of drop-in-replacement (proxy or not) for an exception object isn't mine alone. The implication of the traceback.TracebackException docs is that it may be used as a representative proxy of an exception object. Furthermore, there has already been some consideration for treating TracebackException as a drop-in-replacement in actual technical situations, e.g. when pickling: #73652 (comment).

What would need to happen?

How are __cause__ and __context__ used (or might be used)?

  • sys.excepthook()
  • introspection
  • (hypothetical?) raised directly after handling an exception
  • ???

What would have to change?

  • update TracebackException appropriately (it is used for the default sys.excepthook()2); the diff is actually relatively small
  • ???

Other Notes

Prior discussion about supporting traceback.StackSummary where we currently support __traceback__: #74764 (comment)

Footnotes

  1. This is just like how __traceback__ is currently expected to be a TracebackType instance.

  2. Since gh-110721: Use the traceback module for PyErr_Display() and fallback to the C implementation #110702 landed, we can accommodate TracebackException like this much more easily.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.13bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions