]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-92119: ctypes: Print exception class name instead of its representation (GH-98302)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 8 Nov 2022 05:20:06 +0000 (21:20 -0800)
committerGitHub <noreply@github.com>
Tue, 8 Nov 2022 05:20:06 +0000 (21:20 -0800)
(cherry picked from commit b9dedfe61dce2997e3e6be318d8c50b0c19c9394)

Co-authored-by: Kamil Turek <kamil.turek@hotmail.com>
Doc/library/ctypes.rst
Lib/ctypes/test/test_structures.py
Misc/NEWS.d/next/Core and Builtins/2022-10-15-23-15-14.gh-issue-92119.PMSwwG.rst [new file with mode: 0644]
Modules/_ctypes/callproc.c

index 2900f77589e31b632eb4c565571893bff94c2679..a8d19a9d1a2f52710d802b87c2ea3a8ffc55e271 100644 (file)
@@ -358,7 +358,7 @@ from within *IDLE* or *PythonWin*::
    >>> printf(b"%f bottles of beer\n", 42.5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
-   ArgumentError: argument 2: exceptions.TypeError: Don't know how to convert parameter 2
+   ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2
    >>>
 
 As has been mentioned before, all Python types except integers, strings, and
@@ -421,7 +421,7 @@ prototype for a C function), and tries to convert the arguments to valid types::
    >>> printf(b"%d %d %d", 1, 2, 3)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
-   ArgumentError: argument 2: exceptions.TypeError: wrong type
+   ArgumentError: argument 2: TypeError: wrong type
    >>> printf(b"%s %d %f\n", b"X", 2, 3)
    X 2 3.000000
    13
@@ -471,7 +471,7 @@ single character Python bytes object into a C char::
    >>> strchr(b"abcdef", b"def")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
-   ArgumentError: argument 2: exceptions.TypeError: one character string expected
+   ArgumentError: argument 2: TypeError: one character string expected
    >>> print(strchr(b"abcdef", b"x"))
    None
    >>> strchr(b"abcdef", b"d")
index 97ad2b8ed8a50d7580c3bdf560c6dc5527fb1121..f95d5a99a3a1531d90ca08b265eb82380e4203fe 100644 (file)
@@ -332,13 +332,13 @@ class StructureTestCase(unittest.TestCase):
         cls, msg = self.get_except(Person, b"Someone", (1, 2))
         self.assertEqual(cls, RuntimeError)
         self.assertEqual(msg,
-                             "(Phone) <class 'TypeError'>: "
+                             "(Phone) TypeError: "
                              "expected bytes, int found")
 
         cls, msg = self.get_except(Person, b"Someone", (b"a", b"b", b"c"))
         self.assertEqual(cls, RuntimeError)
         self.assertEqual(msg,
-                             "(Phone) <class 'TypeError'>: too many initializers")
+                             "(Phone) TypeError: too many initializers")
 
     def test_huge_field_name(self):
         # issue12881: segfault with large structure field names
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-10-15-23-15-14.gh-issue-92119.PMSwwG.rst b/Misc/NEWS.d/next/Core and Builtins/2022-10-15-23-15-14.gh-issue-92119.PMSwwG.rst
new file mode 100644 (file)
index 0000000..7142fc6
--- /dev/null
@@ -0,0 +1,2 @@
+Print exception class name instead of its string representation when raising
+errors from :mod:`ctypes` calls.
index 3fab9ad0c1e7bd8c86f60b07ce7a38384d69dad0..7875640ce2b6ddcf27942c6cd0da45b4e88055af 100644 (file)
@@ -1016,7 +1016,10 @@ void _ctypes_extend_error(PyObject *exc_class, const char *fmt, ...)
 
     PyErr_Fetch(&tp, &v, &tb);
     PyErr_NormalizeException(&tp, &v, &tb);
-    cls_str = PyObject_Str(tp);
+    if (PyType_Check(tp))
+        cls_str = PyType_GetName((PyTypeObject *)tp);
+    else
+        cls_str = PyObject_Str(tp);
     if (cls_str) {
         PyUnicode_AppendAndDel(&s, cls_str);
         PyUnicode_AppendAndDel(&s, PyUnicode_FromString(": "));