try..except with empty exceptions

Cameron Simpson cs at
Sun Apr 12 01:08:00 CEST 2015

On 12Apr2015 07:52, Chris Angelico <rosuav at> wrote:
>On Sun, Apr 12, 2015 at 7:37 AM, Cameron Simpson <cs at> wrote:
>> On 11Apr2015 21:21, Chris Angelico <rosuav at> 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/              except:
    lib/python/cs/    except:
    lib/python/cs/      except:
    lib/python/cs/  except:
    lib/python/cs/  except:
    lib/python/cs/      except:
    lib/python/cs/    except:
    lib/python/cs/      except:
    lib/python/cs/nodedb/    except:
    lib/python/cs/          except:
    lib/python/cs/              except:
    lib/python/cs/      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
          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>

On a videophone, the whole world can see you fart.      - Charlie Stross

More information about the Python-list mailing list