[Tutor] Puzzling case of assertRaises not running properly

Steven D'Aprano steve at pearwood.info
Sat Dec 31 01:15:19 EST 2016


On Fri, Dec 30, 2016 at 09:51:46PM +0000, angela ebirim wrote:

> class Bill(object):
> 
>    def tax(self, total):
>      tax = float(total * 0.05)
>      return round(tax, 2)
> 
>    def check_input(self, seat1, app1):
>      try:
>         seat1 = float(seat1)
>         app1 = float(app1)
>      except ValueError:
>          print "Not a float"
>      return (seat1, app1)

Here is your problem. The check_input method doesn't raise ValueError.

*Internally* it gets raised, but then the exception is caught, a 
completely useless message is mysteriously printed ("Not a float" -- 
what's not a float? what is expecting a float?) and the method continues 
as if nothing had happened, only to fail later on with some other error.

Because the ValueError is caught and discarded, there's no ValueError 
for your unit test to catch. Hence the test fails.

(1) The first rule of catching exceptions is: Don't.

(2) The second rule, for experts: If you must, but only if you can 
    recover from the error.

Of course in real life sometimes we do catch exceptions, that's why 
Python has a try...except command so that they can be caught.

But too many people think that the solution to programming bugs is to 
surround everything with try...except, catch the exception, print a 
useless error message (or worse, don't print anything!) and then try to 
continue. It never works, of course, it just makes the code even harder 
to debug. 

As a beginner, before you write a try...except code, you should take a 
quick run around the block followed by a cold shower. If you still think 
you need a try...except block, then *maybe* you can use it.

But as a beginner, you should think that 
exceptions are your best friend in the world. Exceptions show when you 
have made a programming error, or passed the wrong data. How can you fix 
the bug if you don't know where it is? Catching exceptions should be 
done only rarely, when you absolutely need to, because you can recover 
from the error and continue. Never[1] catch an exception just to print a 
bland, boring error message and then continue.



[1] For expert programmers, never say never. Experts know when to break 
the rules.


-- 
Steve


More information about the Tutor mailing list