Skip to content

Commit

Permalink
pythongh-126615: ctypes: Make COMError public (pythonGH-126686)
Browse files Browse the repository at this point in the history
Co-authored-by: Bénédikt Tran <[email protected]>
  • Loading branch information
junkmd and picnixz authored Nov 20, 2024
1 parent 9d2a879 commit 5b45025
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 10 deletions.
47 changes: 41 additions & 6 deletions Doc/library/ctypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.


.. 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

On Windows, when a foreign function call raises a system exception (for
Expand Down Expand Up @@ -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
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
the COM interface as first argument, in addition to those parameters that
are specified in the :attr:`!argtypes` tuple.


The optional *paramflags* parameter creates foreign function wrappers with much
more functionality than the features described above.

Expand Down Expand Up @@ -2741,3 +2740,39 @@ Arrays and pointers

Returns the object to which to pointer points. Assigning to this
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
3 changes: 3 additions & 0 deletions Doc/whatsnew/3.14.rst
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,9 @@ ctypes
to help match a non-default ABI.
(Contributed by Petr Viktorin in :gh:`97702`.)

* The :exc:`~ctypes.COMError` exception is now public.
(Contributed by Jun Komoda in :gh:`126686`.)

datetime
--------

Expand Down
2 changes: 1 addition & 1 deletion Lib/ctypes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
raise Exception("Version number mismatch", __version__, _ctypes_version)

if _os.name == "nt":
from _ctypes import FormatError
from _ctypes import COMError, FormatError

DEFAULT_MODE = RTLD_LOCAL
if _os.name == "posix" and _sys.platform == "darwin":
Expand Down
7 changes: 4 additions & 3 deletions Lib/test/test_ctypes/test_win32.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,16 @@ def test_PARAM(self):
sizeof(c_void_p))

def test_COMError(self):
from _ctypes import COMError
from ctypes import COMError
if support.HAVE_DOCSTRINGS:
self.assertEqual(COMError.__doc__,
"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.text, "text")
self.assertEqual(ex.details, ("details",))
self.assertEqual(ex.details,
("descr", "source", "helpfile", 0, "progid"))

self.assertEqual(COMError.mro(),
[COMError, Exception, BaseException, object])
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
The :exc:`~ctypes.COMError` exception is now public.
Previously, this was private and only available in ``_ctypes``.

0 comments on commit 5b45025

Please sign in to comment.