EXCEPTION HANDLING IN PYTHON
Unlike JavaScript, you cannot add a number and a string in Python. However, you can detect an illegal operation using the try/except construct in Python, which is similar to the try/catch construct in languages such as JavaScript and Java.
An example of a try/except block is here:
try:
x = 4
y = 'abc'
z = x + y
except:
print('cannot add incompatible types:', x, y)
When you run the preceding code, the print() statement in the except code block is executed because the variables x and y have incompatible types.
Earlier in the chapter, you also saw that subtracting two strings throws an exception:
>>> 'a' - 'b' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for -: 'str' and 'str'
A simple way to handle this situation is to use a try/except block:
>>> try:
... print('a' - 'b')
... except TypeError:
... print('TypeError exception while trying to subtract two strings')
... except:
... print('Exception while trying to subtract two strings')
...
The output from the preceding code block is here:
TypeError exception while trying to subtract two strings
As you can see, the preceding code block specifies the finer-grained exception called TypeError, followed by a generic except code block to handle all other exceptions that might occur during the execution of your Python code. This style is similar to the exception handling in Java code.
Listing 1.10 displays the content of exception1.py that illustrates how to handle various types of exceptions.
LISTING 1.10: exception1.py
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as err:
print("I/O error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
Listing 1.10 contains a try block followed by three except statements. If an error occurs in the try block, the first except statement is compared with the type of exception that occurred. If there is a match, then the subsequent print() statement is executed, and the program terminates. If not, a similar test is performed with the second except statement. If neither except statement matches the exception, the third except statement handles the exception, which involves printing a message and then “raising” an exception. Note that you can also specify multiple exception types in a single statement, as shown here:
except (NameError, RuntimeError, TypeError):
print('One of three error types occurred')
The preceding code block is more compact, but you do not know which of the three error types occurred. Python allows you to define custom exceptions, but this topic is beyond the scope of this book.