[Python-Dev] except Exception as err with tb [was: with_traceback]

Jim Jewett jimjjewett at gmail.com
Fri Mar 2 23:44:38 CET 2007


Proposal changed from "err, tb" to "err with tb" at Brett's good suggestion.

The rest of this message is a bit of a sidetrack; skimmers can stop now.

Nick Maclaren wrote:

>"Jim Jewett" <jimjjewett at gmail.com> wrote:
>> Guido van Rossum wrote:

>> > [multiple threads => don't share] whatever object
>> > contains the head of the chain of tracebacks

>> So (full) exceptions can't be unitary objects.

As Shane pointed out[1], the *traceback* could be a unitary object
holding all three pieces of information.  The problem is that we don't
want every except clause adding boilerplate to get the exception back
out.

[1] http://mail.python.org/pipermail/python-dev/2007-February/071417.html

>> In theory, raising an already-instantiated instance could indicate "no
>> traceback", which could make pre-cooked exceptions even lighter.

> The instance contains all of the information about the details, such
> as the exact operation, the values and the context (including the
> traceback).  ...
> ... the action of turning an instance into an object disables
> the ability to fix up the exception and continue. ...
> I don't know of any in the Unix or Microsoft environments, but
> there may be a few in specialised areas.

Lisp does it.  The cost is that instead of dying, those frames become
a continuation, and you need to keep around lots of extra (probable)
garbage.

Dealing with this cleanly was (once upon a time) one of the advantages
of Stackless Python.  Unfortunately, extension modules can call back
into python from the middle of a C function, so the clean restarting
was largely limited to pure python frames; trying to get as close as
possible for other code made the implementation fairly complicated.

> Harking back to your point, your "already-instantiated instance"
> is actually an object derived directly from the exception class, and
> everything becomes clear.  Because it is an object, any context it
> includes was a snapshot and is no longer valid.  In your case, you
> would want it to have "context: unknown".

Rather, I want "context: irrelevant" so it won't bother to keep the
context alive.

That is clearly the right thing for a normal StopIteration.  It isn't
the right thing for all pre-instantiated exceptions.  Whether it is
the right thing often enough to ask those others to use the typical
idiom -- maybe.

-jJ


More information about the Python-Dev mailing list