]> granicus.if.org Git - python/commitdiff
Instantiate the OS-related exception as soon as we raise it, so that
authorAntoine Pitrou <solipsis@pitrou.net>
Wed, 12 Oct 2011 17:39:57 +0000 (19:39 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Wed, 12 Oct 2011 17:39:57 +0000 (19:39 +0200)
"except" works properly.

Lib/test/test_pep3151.py
Python/errors.c

index 9d92425ac2924134f43300ddb080362bd89c9456..3c52bc6a1aa9454099bf9c26704935726014bfd7 100644 (file)
@@ -79,6 +79,18 @@ class HierarchyTest(unittest.TestCase):
         e = SubOSError(EEXIST, "Bad file descriptor")
         self.assertIs(type(e), SubOSError)
 
+    def test_try_except(self):
+        # This checks that try .. except checks the concrete exception
+        # (FileNotFoundError) and not the base type specified when
+        # PyErr_SetFromErrnoWithFilenameObject was called.
+        # (it is therefore deliberate that it doesn't use assertRaises)
+        try:
+            open("some_hopefully_non_existing_file")
+        except FileNotFoundError:
+            pass
+        else:
+            self.fail("should have raised a FileNotFoundError")
+
 
 class AttributesTest(unittest.TestCase):
 
index 6e69d23c3059aa44a2661f7695b80e6f72819d9e..5988e1bf89d4f144f6a8d6586d90898aaf515d93 100644 (file)
@@ -341,7 +341,7 @@ PyObject *
 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
 {
     PyObject *message;
-    PyObject *v;
+    PyObject *v, *args;
     int i = errno;
 #ifndef MS_WINDOWS
     char *s;
@@ -410,14 +410,18 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
     }
 
     if (filenameObject != NULL)
-        v = Py_BuildValue("(iOO)", i, message, filenameObject);
+        args = Py_BuildValue("(iOO)", i, message, filenameObject);
     else
-        v = Py_BuildValue("(iO)", i, message);
+        args = Py_BuildValue("(iO)", i, message);
     Py_DECREF(message);
 
-    if (v != NULL) {
-        PyErr_SetObject(exc, v);
-        Py_DECREF(v);
+    if (args != NULL) {
+        v = PyObject_Call(exc, args, NULL);
+        Py_DECREF(args);
+        if (v != NULL) {
+            PyErr_SetObject((PyObject *) Py_TYPE(v), v);
+            Py_DECREF(v);
+        }
     }
 #ifdef MS_WINDOWS
     LocalFree(s_buf);