Each try block can have multiple corresponding except blocks which intercept exceptions of different types. Let's add a handler for TypeError too:
def convert(s):
"""Convert a string to an integer."""
try:
x = int(s)
print("Conversion succeeded! x =", x)
except ValueError:
print("Conversion failed!")
x = -1
except TypeError:
print("Conversion failed!")
x = -1
return x
Now if we re-run the same test in a fresh REPL we find that TypeError is handled too:
>>> from exceptional import convert
>>> convert([1, 3, 19])
Conversion failed!
-1
We've got some code duplication between our two exception handlers with that duplicated print statement and assignment. We'll move the assignment in front of the try block, which...