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("...