Issue #23571: PyErr_FormatV() and PyErr_SetObject() now always clear the
current exception because they can run arbitrary Python code and so no
exception must be set.
diff --git a/Python/errors.c b/Python/errors.c
index 1d64efd..17e3bcc 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -74,11 +74,11 @@
         if (value == NULL || !PyExceptionInstance_Check(value)) {
             /* We must normalize the value right now */
             PyObject *args, *fixed_value;
-#ifdef Py_DEBUG
-            /* in debug mode, PyEval_EvalFrameEx() fails with an assertion
-               error if an exception is set when it is called */
+
+            /* Issue #23571: PyEval_CallObject() must not be called with an
+               exception set */
             PyErr_Clear();
-#endif
+
             if (value == NULL || value == Py_None)
                 args = PyTuple_New(0);
             else if (PyTuple_Check(value)) {
@@ -778,13 +778,12 @@
 {
     PyObject* string;
 
-#ifdef Py_DEBUG
-    /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
-       if an exception is set when it is called */
+    /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
+       exception set, it calls arbitrary Python code like PyObject_Repr() */
     PyErr_Clear();
-#endif
 
     string = PyUnicode_FromFormatV(format, vargs);
+
     PyErr_SetObject(exception, string);
     Py_XDECREF(string);
     return NULL;