gh-126615: `ctypes`: Make `COMError` public (GH-126686)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
Jun Komoda 2024-11-20 21:53:43 +09:00 committed by GitHub
parent 9d2a879aff
commit 5b4502560b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 51 additions and 10 deletions

View File

@ -1707,12 +1707,6 @@ in :mod:`!ctypes`) which inherits from the private :class:`_CFuncPtr` class:
and raise an exception if the foreign function call failed. and raise an exception if the foreign function call failed.
.. exception:: ArgumentError
This exception is raised when a foreign function call cannot convert one of the
passed arguments.
.. audit-event:: ctypes.set_exception code foreign-functions .. audit-event:: ctypes.set_exception code foreign-functions
On Windows, when a foreign function call raises a system exception (for On Windows, when a foreign function call raises a system exception (for
@ -1799,10 +1793,15 @@ different ways, depending on the type and number of the parameters in the call:
integer. *name* is name of the COM method. *iid* is an optional pointer to integer. *name* is name of the COM method. *iid* is an optional pointer to
the interface identifier which is used in extended error reporting. the interface identifier which is used in extended error reporting.
If *iid* is not specified, an :exc:`OSError` is raised if the COM method
call fails. If *iid* is specified, a :exc:`~ctypes.COMError` is raised
instead.
COM methods use a special calling convention: They require a pointer to COM methods use a special calling convention: They require a pointer to
the COM interface as first argument, in addition to those parameters that the COM interface as first argument, in addition to those parameters that
are specified in the :attr:`!argtypes` tuple. are specified in the :attr:`!argtypes` tuple.
The optional *paramflags* parameter creates foreign function wrappers with much The optional *paramflags* parameter creates foreign function wrappers with much
more functionality than the features described above. more functionality than the features described above.
@ -2741,3 +2740,39 @@ Arrays and pointers
Returns the object to which to pointer points. Assigning to this Returns the object to which to pointer points. Assigning to this
attribute changes the pointer to point to the assigned object. attribute changes the pointer to point to the assigned object.
.. _ctypes-exceptions:
Exceptions
^^^^^^^^^^
.. exception:: ArgumentError
This exception is raised when a foreign function call cannot convert one of the
passed arguments.
.. exception:: COMError(hresult, text, details)
Windows only: This exception is raised when a COM method call failed.
.. attribute:: hresult
The integer value representing the error code.
.. attribute:: text
The error message.
.. attribute:: details
The 5-tuple ``(descr, source, helpfile, helpcontext, progid)``.
*descr* is the textual description. *source* is the language-dependent
``ProgID`` for the class or application that raised the error. *helpfile*
is the path of the help file. *helpcontext* is the help context
identifier. *progid* is the ``ProgID`` of the interface that defined the
error.
.. versionadded:: next

View File

@ -273,6 +273,9 @@ ctypes
to help match a non-default ABI. to help match a non-default ABI.
(Contributed by Petr Viktorin in :gh:`97702`.) (Contributed by Petr Viktorin in :gh:`97702`.)
* The :exc:`~ctypes.COMError` exception is now public.
(Contributed by Jun Komoda in :gh:`126686`.)
datetime datetime
-------- --------

View File

@ -19,7 +19,7 @@ if __version__ != _ctypes_version:
raise Exception("Version number mismatch", __version__, _ctypes_version) raise Exception("Version number mismatch", __version__, _ctypes_version)
if _os.name == "nt": if _os.name == "nt":
from _ctypes import FormatError from _ctypes import COMError, FormatError
DEFAULT_MODE = RTLD_LOCAL DEFAULT_MODE = RTLD_LOCAL
if _os.name == "posix" and _sys.platform == "darwin": if _os.name == "posix" and _sys.platform == "darwin":

View File

@ -65,15 +65,16 @@ class TestWintypes(unittest.TestCase):
sizeof(c_void_p)) sizeof(c_void_p))
def test_COMError(self): def test_COMError(self):
from _ctypes import COMError from ctypes import COMError
if support.HAVE_DOCSTRINGS: if support.HAVE_DOCSTRINGS:
self.assertEqual(COMError.__doc__, self.assertEqual(COMError.__doc__,
"Raised when a COM method call failed.") "Raised when a COM method call failed.")
ex = COMError(-1, "text", ("details",)) ex = COMError(-1, "text", ("descr", "source", "helpfile", 0, "progid"))
self.assertEqual(ex.hresult, -1) self.assertEqual(ex.hresult, -1)
self.assertEqual(ex.text, "text") self.assertEqual(ex.text, "text")
self.assertEqual(ex.details, ("details",)) self.assertEqual(ex.details,
("descr", "source", "helpfile", 0, "progid"))
self.assertEqual(COMError.mro(), self.assertEqual(COMError.mro(),
[COMError, Exception, BaseException, object]) [COMError, Exception, BaseException, object])

View File

@ -0,0 +1,2 @@
The :exc:`~ctypes.COMError` exception is now public.
Previously, this was private and only available in ``_ctypes``.