On 12Apr2015 07:52, Chris Angelico <ros...@gmail.com> wrote:
On Sun, Apr 12, 2015 at 7:37 AM, Cameron Simpson <c...@zip.com.au> wrote:
On 11Apr2015 21:21, Chris Angelico <ros...@gmail.com> wrote:
But I agree, it would be very nice if Python 3 could have abolished
the truly confusing part of this, where "except:" catches everything.
Forcing people to spell it "except BaseException:" would fix all of
this. How hard is it to deprecate and then remove that, same as string
exceptions were removed?

I guess I'll go over there to oppose it then.

Why? It makes it harder to write portable python 2/3 code and does not add
any semantic advantage.

Unless there's a common root exception class in Python 2, which I believe
there isn't, you can't catch all exceptions in python 2 without the
"except:" syntax.  Which means the _only_ way to have some code in both 2
and 3 that does it requires 2 codebases.

As one who tries to have his code run in both 2 (usually recent 2, like
2.6/2.7) and 3, this change would cause a signification breakage for me
without bringing any semantic benefits.

Can you give an example of a place where in Py2 you absolutely have to
catch everything, and don't have control over the code, *and* are
trying to do a one-codebase routine with Py3 compatibility? If you're
trying for 2/3 compatibility, you'll need to have all your exceptions
derive from BaseException anyway.

I don't make many personal exception classes, tending to reuse stdlib ones. I'm sure I have a few.

But regarding codebase:

   [hg/css]fleet*> g except: **/*.py
   lib/python/cs/app/pilfer.py:664:              except:
   lib/python/cs/asynchron.py:145:    except:
   lib/python/cs/db.py:184:      except:
   lib/python/cs/excutils.py:34:  except:
   lib/python/cs/fileutils.py:69:  except:
   lib/python/cs/idset.py:46:      except:
   lib/python/cs/later.py:156:    except:
   lib/python/cs/mailutils.py:274:      except:
   lib/python/cs/nodedb/tokcab.py:57:    except:
   lib/python/cs/queues.py:441:          except:
   lib/python/cs/queues.py:458:              except:
   lib/python/cs/threads.py:131:      except:

Catching all exceptions isn't terribly common, _except_ in service routines that wrap "unknown" operations. Classic example from my Asynchron class:

   def call(self, func, *a, **kw):
     ''' Have the Asynchron call `func(*a,**kw)` and store its values as
         self.result.
         If `func` raises an exception, store it as self.exc_info.
     '''
     try:
       r = func(*a, **kw)
     except:
       self.exc_info = sys.exc_info
     else:
       self.result = r

All sorts of things like thread pools and other "worker" functions, and run-forever daemons like mail filers that can have arbitrary exceptions occur in (partly) third party code eg from config files; you need to catch any unknown exception and fail the specific action, but continue the main daemon operation.

And since I use this code in Python 2, and since not all exceptions are BaseException subclasses, I need the bare syntax.

Also, IMO, a bare "except:" syntax is _far_ more pleasing to the eye than "except magic_exception_name_that+gets_everything:". Also, I wish "BaseException" were just spelled "Exception", if it has to be used.

At very worst, it could be turned into a compat-only syntax feature,
like the u"spam" noise prefix on Unicode strings - serving absolutely
no purpose in Py3 code, and ideally, able to be removed at some point
post-2020.

I'm -0.1 on the idea myself. I consider "except:" succinct and evocative, and prefer it to "except BaseException:".

Cheers,
Cameron Simpson <c...@zip.com.au>

On a videophone, the whole world can see you fart.      - Charlie Stross
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to