Access to return / exception context in finally block

"marius.spix--- via Python-list" <[email protected]>
Newsgroups gmane.comp.python.general
Message-ID <[email protected]>
Dear mailing list,

there is currently no direct way to observe the current interpreter state in a finally block without tracing.

My idea is introducing an immutable __exit_context__ magic variable, which would have one of three possible values:

* ReturnContext(value), if a return statement is about to exit the try, except or else block
* ExceptionContext(exc, tb, caught: bool), if an exception has occured in the try, except or else block
* None, if the try block completes normally without return or exception

This variable would allow to inspect the cause, why a try block is left and make post-processing easier without using workarounds like storing the exception in a temporary variable.

sys.exc_info() is not always useful, because it always returns (None, None, None) when the exception has been caught in the except block.

This is an example, how __exit_context__ could be used:

def f(x):
    try:
        return 10 / x
    except ZeroDivisionError:
        pass
    finally:
        if isinstance(__exit_context__, ExceptionContext):
            log_error(__exit_context__.exc)
            return 0
        elif isinstance(__exit_context__, ReturnContext):
            log_return(__exit_context__.value)
            return __exit_context__.value + 1

I wonder if it would be a candidate for a PEP to be implemented in the Python standard.

Best regards

Marius Spix
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.