Em Dom, 2006-04-02 Ã s 15:54 +0300, Flexx escreveu:
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!"):
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
-1
But this function won't catch exceptions if you don't give it numbers:
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,