[Python-ideas] raising an exception type doesn't instantiate it until it gets caught

Michael Foord fuzzyman at gmail.com
Tue Nov 8 00:06:58 CET 2011


On 7 November 2011 23:05, Michael Foord <fuzzyman at gmail.com> wrote:

>
>
> On 7 November 2011 21:43, Gregory P. Smith <greg at krypto.org> wrote:
>
>>
>>
>> On Mon, Nov 7, 2011 at 12:05 PM, Cameron Simpson <cs at zip.com.au> wrote:
>>
>>> I wrote, naively:
>>> | > I presume StopIteration would get instantiated to a singleton, like
>>> | > NoneType to None? Just asking.
>>>
>>> On 07Nov2011 22:01, Nick Coghlan <ncoghlan at gmail.com> wrote:
>>> | Even without the traceback issue Antoine mentioned, it's already the
>>> | case that StopIteration isn't a singleton in 2.x. Various pieces of
>>> | code (e.g. contextlib.contextmanager) rely on being able to tell
>>> | whether they're getting a specific StopIteration instance back or a
>>> | new one.
>>>
>>> Interesting.
>>>
>>> Off topic digression:
>>>
>>> I've been slightly uncomfortable about exceptions as control flow for a
>>> while, basicly when writing code like this:
>>>
>>>  try:
>>>    x = G.next()
>>>  except StopIteration:
>>>    # G is empty!
>>>
>>> in that I don't entirely know that the StopIteration came from G of from
>>> some buggy code deeper inside G that let a StopIteration out, eg by
>>> mangling a try/except like the above. In most circumstances with other
>>> exceptions, while you might _expect_ the exception to come from the
>>> source you expect you don't care so much because it will indicate
>>> failure of the operation anyway. Report or die, you don't proceed as if
>>> the op was good. But with StopIteration one is reading "G is empty"
>>> directly into the situation and acting as though it is normal (exit the
>>> event loop or whatever it may imply).
>>>
>>
>> Agreed.  Use of exceptions for this in the language feels like it was a
>> convenient way to do it but as the conditions aren't really *exceptional*at all it'd be nice if there were a lighter weight mechanism that could
>> skip the unneeded parts of the exception raising and handling mechanism for
>> the implementation.  We don't need the traceback to be stored in these
>> situations.
>>
>> This existing logic to instantiate and associate the traceback with it
>> only if caught is one way to implement doing exactly that. Any other ideas?
>>
>> Hackish things like a class attribute on classes being raised as an
>> exception, or a LightweightException class being part of its class
>> heirarchy used to signify if that exception should take the full path or
>> the fast path come to mind but could be considered equally surprising.
>>
>> I'm not sure any of this is worth it but it would simplify the eval
>> loop.  We're speaking implementation details of CPython here, not an actual
>> change to the language itself. (*)
>>
>> -gps
>>
>> (*) Please beat anybody who writes code that depends on this somewhat odd
>> exception instantiation timing behavior side effect over the head with a
>> frozen herring.
>>
>
>
> Having the interpreter instantiate the exception for you allows you to do
> wonderful things like this:
>
> >>> class Foo(Exception):
> ...  def __new__(cls, *args):
> ...   return object()
> ...
> >>> try:
> ...  raise Foo
> ... except Exception as e:
> ...  print (e)
> ...
> <object object at 0x100634280>
>
> (I know this has nothing to do with the topic being debated but for some
> reason this code tickles me. Plus it used to segfault Python 3...)
>


Ooh... this one segfaults Python 3.2 - I wonder if that's been fixed yet.

>>> class Foo(Exception):
...  def __new__(cls, *args):
...   return 'string exception'
...
>>> try:
...  raise Foo
... except Exception as e:
...  print (e)
...
Segmentation fault: 11

All the best,

Michael Foord


>
> All the best,
>
>
> Michael
>
>
>
>>
>>
>>
>>> On 07Nov2011 11:35, Antoine Pitrou <solipsis at pitrou.net> wrote:
>>> | It is impossible to use singletons for exception instances now that the
>>> | traceback is stored on them.
>>>
>>> Ah. I had somehow thought the exception itself and the traceback were
>>> distinct items, presented in a tuple.
>>>
>>> On 07Nov2011 21:15, Steven D'Aprano <steve at pearwood.info> wrote:
>>> | Are you asking about what it should be, or what it is?
>>>
>>> The former.
>>>
>>> | Either way:
>>> | >>> a = StopIteration('spam')
>>> | >>> b = StopIteration('ham')
>>> | >>> a is b
>>> | False
>>>
>>> Since my question was about the proposed new behaviour when just a type
>>> was raised, the above test wouldn't educate me. Though it does address
>>> the
>>> behaviour of the type instantation in general.
>>>
>>> Cheers,
>>> --
>>> Cameron Simpson <cs at zip.com.au> DoD#743
>>> http://www.cskk.ezoshosting.com/cs/
>>>
>>> Carpe Datum     - John Sloan <jsloan at ncar.ucar.edu>
>>> _______________________________________________
>>> Python-ideas mailing list
>>> Python-ideas at python.org
>>> http://mail.python.org/mailman/listinfo/python-ideas
>>>
>>
>>
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas at python.org
>> http://mail.python.org/mailman/listinfo/python-ideas
>>
>>
>
>
> --
>
> http://www.voidspace.org.uk/
>
> May you do good and not evil
> May you find forgiveness for yourself and forgive others
>
> May you share freely, never taking more than you give.
> -- the sqlite blessing http://www.sqlite.org/different.html
>
>
>


-- 

http://www.voidspace.org.uk/

May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20111107/ac0e12d7/attachment.html>


More information about the Python-ideas mailing list