[Tutor] How much in a "try" block?

Steven D'Aprano steve at pearwood.info
Fri Aug 23 03:26:24 CEST 2013


On 23/08/13 10:30, Alan Gauld wrote:


> I admit that I've never really found a use for else in a try block.
> I don;t see much advantage in
>
> try: f(x)
> except MyError:
>      pass
> else:
>      g(x)
> h(x)
>
> over
>
> try: f(x)
> except MyError:
>      pass
> g(x)
> h(x)
>
> Unless you really only want g(x) executed if there
> is no MyError exception but want h(x) executed regardless.


That's exactly the use-case for try...else. Admittedly, it's a relatively uncommon use-case, but when you need it, you need it.

Instead of writing something like this:

failed = False
try:
     do_stuff()
except SomeException:
     failed = True
     handle_error()
if not failed:
     do_something_else()
always_do_this()


a cleaner design is to use try...else:

try:
     do_stuff()
except SomeException:
     handle_error()
else:
     do_something_else()
always_do_this()



The advantage of try...else is even more obvious when you combine it with a finally clause:


try:
     do_stuff()
except SomeException:
     handle_error()
else:
     do_something_else()
finally:
     cleanup()
always_do_this()


The cleanup function runs no matter how you exit the try block, whether it is via the except clause, the else clause, or even an unhandled exception. In this case, do_something_else is supposed to run before cleanup. I might be tempted to write this instead:


failed = False
try:
     do_stuff()
except SomeException:
     failed = True
     handle_error()
finally:
     cleanup()
if not failed:
     do_something_else()
always_do_this()


but that's wrong, because now do_something_else runs after cleanup. So I would have to use two try blocks to match the behaviour of try...else...finally.

try:
     failed = False
     try:
         do_stuff()
     except SomeException:
         failed = True
         handle_error()
     if not failed:
         do_something_else()
finally:
     cleanup()
always_do_this()



> I'm curious, how often do others use the try/else combination?

Rarely :-)


In my statistics module[1], out of nearly 2300 lines of code including doc strings, I use "else" just ten times in total and none of them are from try...else.

On the other hand, in my startup file that runs when I launch the Python interactive interpreter, a mere 157 lines, I have *four* try...else blocks. So it really depends on the nature of the code. Here is a typical example:


# === Command line completion and history ===
try:
     import history
except ImportError:
     print('*** warning: command line history not available ***')
else:
     history = history.History()




[1] http://www.python.org/dev/peps/pep-0450/



-- 
Steven


More information about the Tutor mailing list