try..except with empty exceptions
cs at zip.com.au
Sun Apr 12 01:08:00 CEST 2015
On 12Apr2015 07:52, Chris Angelico <rosuav at gmail.com> wrote:
>On Sun, Apr 12, 2015 at 7:37 AM, Cameron Simpson <cs at zip.com.au> wrote:
>> On 11Apr2015 21:21, Chris Angelico <rosuav at 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
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
If `func` raises an exception, store it as self.exc_info.
r = func(*a, **kw)
self.exc_info = sys.exc_info
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
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
I'm -0.1 on the idea myself. I consider "except:" succinct and evocative, and
prefer it to "except BaseException:".
Cameron Simpson <cs at zip.com.au>
On a videophone, the whole world can see you fart. - Charlie Stross
More information about the Python-list