blob: 2963c04c708034e48f053e86bd9c65094d4398bd [file] [log] [blame]
Guido van Rossuma11cccc1997-10-06 20:19:59 +00001"""Class based built-in exception hierarchy.
2
Guido van Rossum64e736b1998-10-02 01:23:47 +00003New with Python 1.5, all standard built-in exceptions are now class objects by
4default. This gives Python's exception handling mechanism a more
5object-oriented feel. Traditionally they were string objects. Python will
6fallback to string based exceptions if the interpreter is invoked with the -X
7option, or if some failure occurs during class exception initialization (in
8this case a warning will be printed).
Guido van Rossuma11cccc1997-10-06 20:19:59 +00009
Guido van Rossum64e736b1998-10-02 01:23:47 +000010Most existing code should continue to work with class based exceptions. Some
11tricky uses of IOError may break, but the most common uses should work.
Guido van Rossuma11cccc1997-10-06 20:19:59 +000012
Guido van Rossum64e736b1998-10-02 01:23:47 +000013Here is a rundown of the class hierarchy. You can change this by editing this
14file, but it isn't recommended. The class names described here are expected
Guido van Rossum7ea1d971998-12-22 13:50:33 +000015to be found by the bltinmodule.c file. If you add classes here, you must
16modify bltinmodule.c or the exceptions won't be available in the __builtin__
17module, nor will they be accessible from C.
Guido van Rossuma11cccc1997-10-06 20:19:59 +000018
Guido van Rossum7ea1d971998-12-22 13:50:33 +000019The classes with a `*' are new since Python 1.5. They are defined as tuples
Guido van Rossum64e736b1998-10-02 01:23:47 +000020containing the derived exceptions when string-based exceptions are used. If
21you define your own class based exceptions, they should be derived from
22Exception.
Guido van Rossuma11cccc1997-10-06 20:19:59 +000023
24Exception(*)
25 |
26 +-- StandardError(*)
27 |
28 +-- SystemExit
29 +-- KeyboardInterrupt
30 +-- ImportError
Guido van Rossum64e736b1998-10-02 01:23:47 +000031 +-- EnvironmentError(*)
32 | |
33 | +-- IOError
34 | +-- OSError(*)
35 |
Guido van Rossuma11cccc1997-10-06 20:19:59 +000036 +-- EOFError
37 +-- RuntimeError
Guido van Rossum7ea1d971998-12-22 13:50:33 +000038 | |
39 | +-- NotImplementedError(*)
40 |
Guido van Rossuma11cccc1997-10-06 20:19:59 +000041 +-- NameError
42 +-- AttributeError
43 +-- SyntaxError
44 +-- TypeError
45 +-- AssertionError
46 +-- LookupError(*)
47 | |
48 | +-- IndexError
49 | +-- KeyError
50 |
51 +-- ArithmeticError(*)
52 | |
53 | +-- OverflowError
54 | +-- ZeroDivisionError
55 | +-- FloatingPointError
56 |
57 +-- ValueError
58 +-- SystemError
59 +-- MemoryError
60"""
61
62class Exception:
Guido van Rossum3e0d3191999-01-25 21:57:29 +000063 """Proposed base class for all exceptions."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +000064 def __init__(self, *args):
Guido van Rossum548703a1998-03-26 22:14:20 +000065 self.args = args
Guido van Rossuma11cccc1997-10-06 20:19:59 +000066
67 def __str__(self):
68 if not self.args:
69 return ''
Guido van Rossum548703a1998-03-26 22:14:20 +000070 elif len(self.args) == 1:
71 return str(self.args[0])
72 else:
73 return str(self.args)
Guido van Rossuma11cccc1997-10-06 20:19:59 +000074
75 def __getitem__(self, i):
Guido van Rossum548703a1998-03-26 22:14:20 +000076 return self.args[i]
Guido van Rossuma11cccc1997-10-06 20:19:59 +000077
78class StandardError(Exception):
Guido van Rossum3e0d3191999-01-25 21:57:29 +000079 """Base class for all standard Python exceptions."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +000080 pass
81
82class SyntaxError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +000083 """Invalid syntax."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +000084 filename = lineno = offset = text = None
85 msg = ""
86 def __init__(self, *args):
Guido van Rossum548703a1998-03-26 22:14:20 +000087 self.args = args
88 if len(self.args) >= 1:
89 self.msg = self.args[0]
90 if len(self.args) == 2:
91 info = self.args[1]
92 try:
93 self.filename, self.lineno, self.offset, self.text = info
94 except:
95 pass
Guido van Rossuma11cccc1997-10-06 20:19:59 +000096 def __str__(self):
97 return str(self.msg)
98
Guido van Rossume03c0501998-08-12 02:38:11 +000099class EnvironmentError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000100 """Base class for I/O related errors."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000101 def __init__(self, *args):
Guido van Rossum548703a1998-03-26 22:14:20 +0000102 self.args = args
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000103 self.errno = None
104 self.strerror = None
Guido van Rossume03c0501998-08-12 02:38:11 +0000105 self.filename = None
106 if len(args) == 3:
107 # open() errors give third argument which is the filename. BUT,
108 # so common in-place unpacking doesn't break, e.g.:
109 #
110 # except IOError, (errno, strerror):
111 #
112 # we hack args so that it only contains two items. This also
113 # means we need our own __str__() which prints out the filename
114 # when it was supplied.
115 self.errno, self.strerror, self.filename = args
116 self.args = args[0:2]
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000117 if len(args) == 2:
118 # common case: PyErr_SetFromErrno()
Guido van Rossume03c0501998-08-12 02:38:11 +0000119 self.errno, self.strerror = args
120
121 def __str__(self):
122 if self.filename is not None:
123 return '[Errno %s] %s: %s' % (self.errno, self.strerror,
124 repr(self.filename))
125 elif self.errno and self.strerror:
126 return '[Errno %s] %s' % (self.errno, self.strerror)
127 else:
128 return StandardError.__str__(self)
129
130class IOError(EnvironmentError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000131 """I/O operation failed."""
Guido van Rossume03c0501998-08-12 02:38:11 +0000132 pass
133
134class OSError(EnvironmentError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000135 """OS system call failed."""
Guido van Rossume03c0501998-08-12 02:38:11 +0000136 pass
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000137
138class RuntimeError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000139 """Unspecified run-time error."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000140 pass
141
Guido van Rossum7ea1d971998-12-22 13:50:33 +0000142class NotImplementedError(RuntimeError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000143 """Method or function hasn't been implemented yet."""
Guido van Rossum7ea1d971998-12-22 13:50:33 +0000144 pass
145
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000146class SystemError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000147 """Internal error in the Python interpreter.
148
149 Please report this to the Python maintainer, along with the traceback,
150 the Python version, and the hardware/OS platform and version."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000151 pass
152
153class EOFError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000154 """Read beyond end of file."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000155 pass
156
157class ImportError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000158 """Import can't find module, or can't find name in module."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000159 pass
160
161class TypeError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000162 """Inappropriate argument type."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000163 pass
164
165class ValueError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000166 """Inappropriate argument value (of correct type)."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000167 pass
168
169class KeyboardInterrupt(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000170 """Program interrupted by user."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000171 pass
172
173class AssertionError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000174 """Assertion failed."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000175 pass
176
177class ArithmeticError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000178 """Base class for arithmetic errors."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000179 pass
180
181class OverflowError(ArithmeticError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000182 """Result too large to be represented."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000183 pass
184
185class FloatingPointError(ArithmeticError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000186 """Floating point operation failed."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000187 pass
188
189class ZeroDivisionError(ArithmeticError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000190 """Second argument to a division or modulo operation was zero."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000191 pass
192
193class LookupError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000194 """Base class for lookup errors."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000195 pass
196
197class IndexError(LookupError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000198 """Sequence index out of range."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000199 pass
200
201class KeyError(LookupError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000202 """Mapping key not found."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000203 pass
204
205class AttributeError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000206 """Attribute not found."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000207 pass
208
209class NameError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000210 """Name not found locally or globally."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000211 pass
212
213class MemoryError(StandardError):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000214 """Out of memory."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000215 pass
216
217class SystemExit(Exception):
Guido van Rossum3e0d3191999-01-25 21:57:29 +0000218 """Request to exit from the interpreter."""
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000219 def __init__(self, *args):
Guido van Rossum548703a1998-03-26 22:14:20 +0000220 self.args = args
Guido van Rossuma11cccc1997-10-06 20:19:59 +0000221 if len(args) == 0:
222 self.code = None
223 elif len(args) == 1:
224 self.code = args[0]
225 else:
226 self.code = args