]> granicus.if.org Git - python/commitdiff
merge this from trunk:
authorGregory P. Smith <greg@mad-scientist.com>
Sun, 9 Sep 2007 23:55:55 +0000 (23:55 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Sun, 9 Sep 2007 23:55:55 +0000 (23:55 +0000)
r58067 | gregory.p.smith | 2007-09-09 16:36:46 -0700 (Sun, 09 Sep 2007) | 22 lin
es

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.

Doc/library/exceptions.rst
Doc/library/socket.rst
Doc/whatsnew/2.6.rst
Lib/test/test_urllib2net.py
Lib/urllib2.py
Modules/socketmodule.c

index 9bc597e820873ac975fe71d5e8532b8f0f3d4b0f..c35d7d43eeb89316602b3fe8c98c540636943c2f 100644 (file)
@@ -147,6 +147,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
 
index 758cfb14956f78ea36012257504ed61190b5d81c..7512e56d3e8c904f22ffae3b23111aacf2190368 100644 (file)
@@ -85,6 +85,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
 
index dd537d34cea97389410e58bdc9760e4448c19a46..154b103139e2cb0aea966a964db87a01d8769b16 100644 (file)
@@ -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`.
 
 .. % ======================================================================
 
index 02d69cfabc76d22f13998301e352756b738b24c7..fae7e4d2bfb9ec5c6a2286781a53d6ffac729020 100644 (file)
@@ -164,8 +164,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',
             ]
@@ -179,10 +180,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:
@@ -242,11 +240,11 @@ class OtherNetworkTests(unittest.TestCase):
             debug(url)
             try:
                 f = urllib2.urlopen(url, req)
-            except (IOError, socket.error, OSError) as err:
+            except EnvironmentError as 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():
index 58e01533034e0a8a3ba0b5191c1baa2e21a3992a..2aa90d72c81c7297f5400e48655eaff28f1244c3 100644 (file)
@@ -1240,7 +1240,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
@@ -1286,7 +1286,7 @@ class FTPHandler(BaseHandler):
             headers = mimetools.Message(sf)
             return addinfourl(fp, headers, req.get_full_url())
         except ftplib.all_errors as msg:
-            raise IOError('ftp error', msg).with_traceback(sys.exc_info()[2])
+            raise URLError('ftp error', msg).with_traceback(sys.exc_info()[2])
 
     def connect_ftp(self, user, passwd, host, port, dirs, timeout):
         fw = ftpwrapper(user, passwd, host, port, dirs, timeout)
index b33798d1423bf9364f58337cda3ea9a3f7a774ba..90a2f964000cf6698b5701fc685d3c0d616930be 100644 (file)
@@ -4035,7 +4035,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;