J
John Nagle
Here are three network-related exceptions. These
were caught by "except" with no exception type, because
none of the more specific exceptions matched. This
is what a traceback produced:
1. File "D:\Python24\lib\socket.py", line 295, in read
data = self._sock.recv(recv_size)
timeout: timed out
2. File "D:\Python24\lib\socket.py", line 295, in read
data = self._sock.recv(recv_size)
error: (10054, 'Connection reset by peer')
3. File "D:\Python24\lib\socket.py", line 317, in readline
data = recv(1)
IOError: [Errno socket error] timed out
For 1 and 2, those are errors that aren't in the
exception hierarchy. Looking at the C code for "socketmodule.c",
it's clear that "socket.error" doesn't inherit from any standard
exception class. See, in "init_socket()":
socket_error = PyErr_NewException("socket.error", NULL, NULL);
That first NULL should be some parent exception, maybe "IOError".
As it is, "socket.error" is outside the standard exception hierarchy.
That's not too good.
Case #3, IOError, should have been caught by this:
except IOError, message: # I/O error
But it wasn't. The "IOError" fell through, was caught by the
next outer exception block, and was logged as a generic
error.
I can't find where in the Python socket module an "IOError"
could be raised. I would have expected "socket.timeout".
Anyway, I need to know the full set of exceptions that can
be raised by sockets. Thanks.
John Nagle
were caught by "except" with no exception type, because
none of the more specific exceptions matched. This
is what a traceback produced:
1. File "D:\Python24\lib\socket.py", line 295, in read
data = self._sock.recv(recv_size)
timeout: timed out
2. File "D:\Python24\lib\socket.py", line 295, in read
data = self._sock.recv(recv_size)
error: (10054, 'Connection reset by peer')
3. File "D:\Python24\lib\socket.py", line 317, in readline
data = recv(1)
IOError: [Errno socket error] timed out
For 1 and 2, those are errors that aren't in the
exception hierarchy. Looking at the C code for "socketmodule.c",
it's clear that "socket.error" doesn't inherit from any standard
exception class. See, in "init_socket()":
socket_error = PyErr_NewException("socket.error", NULL, NULL);
That first NULL should be some parent exception, maybe "IOError".
As it is, "socket.error" is outside the standard exception hierarchy.
That's not too good.
Case #3, IOError, should have been caught by this:
except IOError, message: # I/O error
But it wasn't. The "IOError" fell through, was caught by the
next outer exception block, and was logged as a generic
error.
I can't find where in the Python socket module an "IOError"
could be raised. I would have expected "socket.timeout".
Anyway, I need to know the full set of exceptions that can
be raised by sockets. Thanks.
John Nagle