Em Dom, 2006-04-02 às 15:54 +0300, Flexx escreveu: > Ben Finney writes: > > This allows all other exceptions to propogate back through the call > > stack. > > import sys, logging > try: > foo = 12/0 > except: > e = str(sys.exc_value) > print "You *knew* this was going to happen: '%s'" % (e) > logging.error(e)
The point (I think) Ben was trying to show is that you should not hide exceptions from the caller's code unless you expected that exception. For example: def percentage(now, total): """Returns the percentage of now in total.""" return now * 100.0 / total Very simple. What if I do "percentage(1, 0)"? The code expected me to be clever enough to know that you can't make a percentage when the total is zero, so it lets the exception pass by to my code (like: "it's your problem, not mine!"): >>> percentage(1, 0) Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 3, in percentage ZeroDivisionError: float division But if your function is being used on a context where total can be zero and it has a meaning, for example, returning -1, then _in_this_case_ you should catch the exception: def percentage(now, total): """Returns the percentage of now in total. If total is zero, then return -1. """ try: return now * 100.0 / total except ZeroDivisionError: return -1 >>> percentage(1, 0) -1 But this function won't catch exceptions if you don't give it numbers: >>> percentage(None, 1) Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 7, in percentage TypeError: unsupported operand type(s) for *: 'NoneType' and 'float' But this is also a problem on the caller's code! You should *not* hide it from him! But if None is valid in the context of your code, then... well, you get the point! =) HTH, -- Felipe. -- http://mail.python.org/mailman/listinfo/python-list