Re-raising exceptions

Instead of returning an unPythonic error code, we can simply emit our error message and re-raise the exception object we're currently handling. This can be done by replacing the return -1 with a raise statement at the end of our exception handling block:

def convert(s):
"""Convert a string to an integer."""
try:
return int(s)
except (ValueError, TypeError) as e:
print("Conversion error: {}".format(str(e)), file=sys.stderr)
raise

Without a parameter raise simply re-raises the exception that is currently being handled.

Testing in the REPL, we can see that the original exception type is re-raised whether it's a ValueError or a TypeError, and our Conversion error message is printed to stderr along the way:

>>> from exceptional import string_log
>>> string_log("25")
3.2188758248682006
>>> string_log("cat")
Conversion error: invalid literal for int() with base 10: 'cat'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./exceptional.py", line 14, in string_log
v = convert(s)
File "./exceptional.py", line 6, in convert
return int(s)
ValueError: invalid literal for int() with base 10: 'cat'
>>> string_log([5, 3, 1])
Conversion error: int() argument must be a string or a number, not 'list'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./exceptional.py", line 14, in string_log
v = convert(s)
File "./exceptional.py", line 6, in convert
return int(s)
TypeError: int() argument must be a string or a number, not 'list'

 

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset