<div class="gmail_quote">On Sun, Nov 6, 2011 at 5:46 PM, Nick Coghlan <span dir="ltr"><<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="HOEnZb"><div class="h5">On Mon, Nov 7, 2011 at 11:38 AM, Gregory P. Smith <<a href="mailto:greg@krypto.org">greg@krypto.org</a>> wrote:<br>
><br>
> On Tue, Nov 1, 2011 at 1:15 AM, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>> wrote:<br>
>><br>
>> No, the traceback info is added by the eval loop itself. Remember that<br>
>> when you raise an exception *type* (rather than an instance), the<br>
>> exception doesn't get instantiated until it gets caught somewhere -<br>
>> the eval loop maintains the unwinding stack for the traceback as part<br>
>> of the thread state until it is time to attach it to the exception<br>
>> object.<br>
><br>
> I did not know that.  Is there a good reason for doing this?  It seems<br>
> unnecessarily complicated.<br>
<br>
</div></div>You'll have to ask Guido that one - it's been like that since long<br>
before I got involved in hacking on the interpreter.<br>
<br>
It's possibly a lingering artifact of the old "exceptions are just<br>
strings" design, since traceback storage didn't get added to exception<br>
instances until Py3k.<br></blockquote><div><br>No, it was actually introduced when exceptions became classes. It is an optimization that we deemed important at the time: to avoid instantiating the class when it's going to be caught by C code that doesn't care about the instance. A common example is StopIteration, but there are probably plenty of other situations like it. We may even have benchmarked for-loops with and without this -- while the exception only happens once per for-loop, there are a lot of for-loops, many of which iterate over small sequences, and it adds up.<br>

<br>I'm not sure that it's still that important -- in fact I'm not sure Python 3 still has this behavior.<br></div></div><br>-- <br>--Guido van Rossum (<a href="http://python.org/~guido">python.org/~guido</a>)<br>