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):
PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
{
PyObject *message;
- PyObject *v;
+ PyObject *v, *args;
int i = errno;
#ifndef MS_WINDOWS
char *s;
}
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);