Skip to content

Commit 7cac4eb

Browse files
authored
Extend PyWin_SetAPIError (#2188)
1 parent e0fda45 commit 7cac4eb

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

win32/src/PyWinTypes.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ extern PYWINTYPES_EXPORT BOOL PyWin_RegisterErrorMessageModule(DWORD first, DWOR
101101
extern PYWINTYPES_EXPORT HINSTANCE PyWin_GetErrorMessageModule(DWORD err);
102102

103103
/* A global function that sets an API style error (ie, (code, fn, errTest)) */
104-
PYWINTYPES_EXPORT PyObject *PyWin_SetAPIError(char *fnName, long err = 0);
104+
PYWINTYPES_EXPORT PyObject *PyWin_SetAPIError(char *fnName, long err = ERROR_SUCCESS);
105+
106+
// A PyWin_SetAPIError variant that returns None (Py_None) on success.
107+
PYWINTYPES_EXPORT PyObject *PyWin_SetAPIErrorOrReturnNone(char *fnName, long err = ERROR_SUCCESS);
105108

106109
/* Basic COM Exception handling. The main COM exception object
107110
is actually defined here. However, the most useful functions

win32/src/PyWinTypesmodule.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,9 @@ HINSTANCE PyWin_GetErrorMessageModule(DWORD err)
275275
}
276276

277277
/* error helper - GetLastError() is provided, but this is for exceptions */
278-
PyObject *PyWin_SetAPIError(char *fnName, long err /*= 0*/)
278+
PyObject *PyWin_SetAPIError(char *fnName, long err /*= ERROR_SUCCESS*/)
279279
{
280-
DWORD errorCode = err == 0 ? GetLastError() : err;
280+
DWORD errorCode = err == ERROR_SUCCESS ? GetLastError() : err;
281281
DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS;
282282
// try and find the hmodule providing this error.
283283
HMODULE hmodule = PyWin_GetErrorMessageModule(errorCode);
@@ -308,6 +308,15 @@ PyObject *PyWin_SetAPIError(char *fnName, long err /*= 0*/)
308308
return NULL;
309309
}
310310

311+
/* error helper - like PyWin_SetAPIError, but returns None on success */
312+
PyObject *PyWin_SetAPIErrorOrReturnNone(char *fnName, long err /*= ERROR_SUCCESS*/)
313+
{
314+
DWORD errorCode = err == ERROR_SUCCESS ? GetLastError() : err;
315+
if (errorCode == ERROR_SUCCESS)
316+
Py_RETURN_NONE;
317+
return PyWin_SetAPIError(fnName, errorCode);
318+
}
319+
311320
// This function sets a basic COM error - it is a valid COM
312321
// error, but may not contain rich error text about the error.
313322
// Designed to be used before pythoncom has been loaded.

0 commit comments

Comments
 (0)