Should I use "if" or "try" (as a matter of speed)?

John Roth newsgroups at jhrothjr.com
Sat Jul 9 16:48:34 EDT 2005


"Thorsten Kampe" <thorsten at thorstenkampe.de> wrote in message 
news:6i1zj31xlx8.yoof0r88btd1.dlg at 40tude.net...
>* Steve Juranich (2005-07-09 19:21 +0100)
>> I know that this topic has the potential for blowing up in my face,
>> but I can't help asking.  I've been using Python since 1.5.1, so I'm
>> not what you'd call a "n00b".  I dutifully evangelize on the goodness
>> of Python whenever I talk with fellow developers, but I always hit a
>> snag when it comes to discussing the finer points of the execution
>> model (specifically, exceptions).
>>
>> Without fail, when I start talking with some of the "old-timers"
>> (people who have written code in ADA or Fortran), I hear the same
>> arguments that using "if" is "better" than using "try".  I think that
>> the argument goes something like, "When you set up a 'try' block, you
>> have to set up a lot of extra machinery than is necessary just
>> executing a simple conditional."
>>
>> I was wondering how true this holds for Python, where exceptions are
>> such an integral part of the execution model.  It seems to me, that if
>> I'm executing a loop over a bunch of items, and I expect some
>> condition to hold for a majority of the cases, then a "try" block
>> would be in order, since I could eliminate a bunch of potentially
>> costly comparisons for each item.  But in cases where I'm only trying
>> a single getattr (for example), using "if" might be a cheaper way to
>> go.
>>
>> What do I mean by "cheaper"?  I'm basically talking about the number
>> of instructions that are necessary to set up and execute a try block
>> as opposed to an if block.
>
> "Catch errors rather than avoiding them to avoid cluttering your code
> with special cases. This idiom is called EAFP ('easier to ask
> forgiveness than permission'), as opposed to LBYL ('look before you
> leap')."
>
> http://jaynes.colorado.edu/PythonIdioms.html

It depends on what you're doing, and I don't find a "one size fits all"
approach to be all that useful.

If execution speed is paramount and exceptions are relatively rare,
then the try block is the better approach.

If you simply want to throw an exception, then the clearest way
of writing it that I've ever found is to encapsulate the raise statement
together with the condition test in a subroutine with a name that
describes what's being tested for. Even a name as poor as
"HurlOnFalseCondition(<condition>, <exception>, <parms>, <message>)
can be very enlightening. It gets rid of the in-line if and raise 
statements,
at the cost of an extra method call.

John Roth



In both approaches, you have some
error handling code that is going to clutter up your program flow.





More information about the Python-list mailing list