Skip to content

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

Closed
@ericsnowcurrently

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.

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