[Python-Dev] should list's call to len swallow SystemExit? (original) (raw)

Guido van Rossum guido at python.org
Wed Jan 14 19:19:34 CET 2009


On Wed, Jan 14, 2009 at 10:11 AM, Raymond Hettinger <python at rcn.com> wrote:

PyObjectLengthHint() is specified to never fail. If any exception occurs along the way, it returns a default value. In the context of checking for length hints from an iterator, this seems reasonable to me.

If you want this changed, I can use a negative return value for other than an attribute error, and modify the calling code to handle the exception. To me this isn't worth making the code slower and more complex. But I can also see wanting to catch a SystemError at any possible step.

It has the potential of masking errors, and thus I'd like to see it fixed.

I presume this same issue occurs everywhere the C API has a this never fails specification so that we have simpler, faster calling code at the expense of being able to raise a SystemError in every possible piece of code.

"This never fails" C APIs that invoke Python code (or e.g. allocate memory) are not supposed to exist in CPython, for the reason above. There used to be several but we gradually killed them all. I'm sorry I wasn't involved more deeply in the review of this feature, I would have warned about it.

Raymond

From: "Guido van Rossum" <guido at python.org> There seems to be an unconditional PyErrClear() in PyObjectLengthHint(). I think that could and should be much more careful; it probably should only ignore AttributeErrors (though there may be unittests to the contrary). On Tue, Jan 13, 2009 at 8:24 PM, Dino Viehland <dinov at microsoft.com> wrote: We had a bug reported that effectively boils down to we're not swallowing exceptions when list calls len (http://www.codeplex.com/WorkItem/View.aspx?ProjectName=IronPython&WorkItemId=20598). We can obviously make the change to catch exceptions here in IronPython even if it seems like a bad idea to me ☺ But CPython seems to catch not only normal exceptions, but also SystemExit. It seems like there's been a move away from this so I thought I'd mention it here. I tested it on 2.6.1 and 3.0. import sys class A(object): def iter(self): return iter(range(10)) def len(self): try: print('exiting') sys.exit(1) except Exception as e: print('can I catch it?', e) list(A()) which prints: exiting [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


Python-Dev mailing list Python-Dev at python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org

-- --Guido van Rossum (home page: http://www.python.org/~guido/)


Python-Dev mailing list Python-Dev at python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/python%40rcn.com

-- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list