try..except with empty exceptions

Cameron Simpson 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
    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 <cs at zip.com.au>

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



More information about the Python-list mailing list