From: Gregory P. Smith Date: Sun, 9 Sep 2007 23:36:46 +0000 (+0000) Subject: Change socket.error to inherit from IOError rather than being a stand X-Git-Tag: v2.6a1~1324 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9fef694b4929d535a7c12480b5adae28d394d79;p=python Change socket.error to inherit from IOError rather than being a stand alone class. This addresses the primary concern in http://bugs.python.org/issue1706815 python-dev discussion here: http://mail.python.org/pipermail/python-dev/2007-July/073749.html I chose IOError rather than EnvironmentError as the base class since socket objects are often used as transparent duck typed file objects in code already prepared to deal with IOError exceptions. also a minor fix: urllib2 - fix a couple places where IOError was raised rather than URLError. for better or worse, URLError already inherits from IOError so this won't break any existing code. test_urllib2net - replace bad ftp urls. --- diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 9081cf797a..623d73b41b 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -170,6 +170,9 @@ The following exceptions are the exceptions that are actually raised. This class is derived from :exc:`EnvironmentError`. See the discussion above for more information on exception instance attributes. + .. versionchanged:: 2.6 + Changed :exc:`socket.error` to use this as a base class. + .. exception:: ImportError diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index ca4515f537..dbe7e66a0e 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -86,6 +86,9 @@ The module :mod:`socket` exports the following constants and functions: accompanying :exc:`os.error`. See the module :mod:`errno`, which contains names for the error codes defined by the underlying operating system. + .. versionchanged:: 2.6 + :exc:`socket.error` is now a child class of :exc:`IOError`. + .. exception:: herror diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index a5ed8694be..6c799fdea9 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -282,7 +282,8 @@ Porting to Python 2.6 This section lists previously described changes that may require changes to your code: -* Everything is all in the details! +* The :mod:`socket` module exception :exc:`socket.error` now inherits from + :exc:`IOError`. .. % ====================================================================== diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index c363140fc2..9d4f4634c1 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -166,8 +166,9 @@ class OtherNetworkTests(unittest.TestCase): def test_ftp(self): urls = [ - 'ftp://www.python.org/pub/python/misc/sousa.au', - 'ftp://www.python.org/pub/tmp/blat', + 'ftp://ftp.kernel.org/pub/linux/kernel/README', + 'ftp://ftp.kernel.org/pub/linux/kernel/non-existant-file', + #'ftp://ftp.kernel.org/pub/leenox/kernel/test', 'ftp://gatekeeper.research.compaq.com/pub/DEC/SRC' '/research-reports/00README-Legal-Rules-Regs', ] @@ -181,10 +182,7 @@ class OtherNetworkTests(unittest.TestCase): f.close() urls = [ 'file:'+sanepathname2url(os.path.abspath(TESTFN)), - - # XXX bug, should raise URLError - #('file://nonsensename/etc/passwd', None, urllib2.URLError) - ('file://nonsensename/etc/passwd', None, (EnvironmentError, socket.error)) + ('file:///nonsensename/etc/passwd', None, urllib2.URLError), ] self._test_urls(urls, self._extra_handlers()) finally: @@ -244,11 +242,11 @@ class OtherNetworkTests(unittest.TestCase): debug(url) try: f = urllib2.urlopen(url, req) - except (IOError, socket.error, OSError), err: + except EnvironmentError, err: debug(err) if expected_err: - msg = ("Didn't get expected error(s) %s for %s %s, got %s" % - (expected_err, url, req, err)) + msg = ("Didn't get expected error(s) %s for %s %s, got %s: %s" % + (expected_err, url, req, type(err), err)) self.assert_(isinstance(err, expected_err), msg) else: with test_support.transient_internet(): diff --git a/Lib/urllib2.py b/Lib/urllib2.py index b2cec727fa..5a6f49995f 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -1246,7 +1246,7 @@ class FTPHandler(BaseHandler): import mimetypes host = req.get_host() if not host: - raise IOError, ('ftp error', 'no host given') + raise URLError, ('ftp error', 'no host given') host, port = splitport(host) if port is None: port = ftplib.FTP_PORT @@ -1292,7 +1292,7 @@ class FTPHandler(BaseHandler): headers = mimetools.Message(sf) return addinfourl(fp, headers, req.get_full_url()) except ftplib.all_errors, msg: - raise IOError, ('ftp error', msg), sys.exc_info()[2] + raise URLError, ('ftp error', msg), sys.exc_info()[2] def connect_ftp(self, user, passwd, host, port, dirs, timeout): fw = ftpwrapper(user, passwd, host, port, dirs, timeout) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index d319ca3a6a..410398eddf 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -4280,7 +4280,8 @@ init_socket(void) if (m == NULL) return; - socket_error = PyErr_NewException("socket.error", NULL, NULL); + socket_error = PyErr_NewException("socket.error", + PyExc_IOError, NULL); if (socket_error == NULL) return; PySocketModuleAPI.error = socket_error;