So far, I’ve been deliberately vague about what an exception actually is. As suggested in the prior chapter, in Python 2.6 and 3.0 both built-in and user-defined exceptions are identified by class instance objects. Although this means you must use object-oriented programming to define new exceptions in your programs, classes and OOP in general offer a number of benefits.
Here are some of the advantages of class-based exceptions:
They can be organized into
categories. Exception classes support future changes by
providing categories—adding new exceptions in the future won’t
generally require changes in
They have attached state
information. Exception classes provide a natural place
for us to store context information for use in the
try handler—they may have both attached
state information and callable methods, accessible through
They support inheritance. Class-based exceptions can participate in inheritance hierarchies to obtain and customize common behavior—inherited display methods, for example, can provide a common look and feel for error messages.
Because of these advantages, class-based exceptions support program evolution and larger systems well. In fact, all built-in exceptions are identified by classes and are organized into an inheritance tree, for the reasons just listed. You can do the same with user-defined exceptions of your own.
In Python 3.0, user-defined exceptions inherit from built-in exception superclasses. As we’ll ...