Home | History | Annotate | Download | only in Python
      1 
      2 /* Error handling */
      3 
      4 #include "Python.h"
      5 
      6 #ifndef __STDC__
      7 #ifndef MS_WINDOWS
      8 extern char *strerror(int);
      9 #endif
     10 #endif
     11 
     12 #ifdef MS_WINDOWS
     13 #include <windows.h>
     14 #include <winbase.h>
     15 #endif
     16 
     17 #include <ctype.h>
     18 
     19 #ifdef __cplusplus
     20 extern "C" {
     21 #endif
     22 
     23 _Py_IDENTIFIER(builtins);
     24 _Py_IDENTIFIER(stderr);
     25 
     26 
     27 void
     28 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
     29 {
     30     PyThreadState *tstate = PyThreadState_GET();
     31     PyObject *oldtype, *oldvalue, *oldtraceback;
     32 
     33     if (traceback != NULL && !PyTraceBack_Check(traceback)) {
     34         /* XXX Should never happen -- fatal error instead? */
     35         /* Well, it could be None. */
     36         Py_DECREF(traceback);
     37         traceback = NULL;
     38     }
     39 
     40     /* Save these in locals to safeguard against recursive
     41        invocation through Py_XDECREF */
     42     oldtype = tstate->curexc_type;
     43     oldvalue = tstate->curexc_value;
     44     oldtraceback = tstate->curexc_traceback;
     45 
     46     tstate->curexc_type = type;
     47     tstate->curexc_value = value;
     48     tstate->curexc_traceback = traceback;
     49 
     50     Py_XDECREF(oldtype);
     51     Py_XDECREF(oldvalue);
     52     Py_XDECREF(oldtraceback);
     53 }
     54 
     55 static PyObject*
     56 _PyErr_CreateException(PyObject *exception, PyObject *value)
     57 {
     58     if (value == NULL || value == Py_None) {
     59         return _PyObject_CallNoArg(exception);
     60     }
     61     else if (PyTuple_Check(value)) {
     62         return PyObject_Call(exception, value, NULL);
     63     }
     64     else {
     65         return _PyObject_CallArg1(exception, value);
     66     }
     67 }
     68 
     69 void
     70 PyErr_SetObject(PyObject *exception, PyObject *value)
     71 {
     72     PyThreadState *tstate = PyThreadState_GET();
     73     PyObject *exc_value;
     74     PyObject *tb = NULL;
     75 
     76     if (exception != NULL &&
     77         !PyExceptionClass_Check(exception)) {
     78         PyErr_Format(PyExc_SystemError,
     79                      "exception %R not a BaseException subclass",
     80                      exception);
     81         return;
     82     }
     83 
     84     Py_XINCREF(value);
     85     exc_value = tstate->exc_value;
     86     if (exc_value != NULL && exc_value != Py_None) {
     87         /* Implicit exception chaining */
     88         Py_INCREF(exc_value);
     89         if (value == NULL || !PyExceptionInstance_Check(value)) {
     90             /* We must normalize the value right now */
     91             PyObject *fixed_value;
     92 
     93             /* Issue #23571: functions must not be called with an
     94                exception set */
     95             PyErr_Clear();
     96 
     97             fixed_value = _PyErr_CreateException(exception, value);
     98             Py_XDECREF(value);
     99             if (fixed_value == NULL) {
    100                 return;
    101             }
    102 
    103             value = fixed_value;
    104         }
    105 
    106         /* Avoid reference cycles through the context chain.
    107            This is O(chain length) but context chains are
    108            usually very short. Sensitive readers may try
    109            to inline the call to PyException_GetContext. */
    110         if (exc_value != value) {
    111             PyObject *o = exc_value, *context;
    112             while ((context = PyException_GetContext(o))) {
    113                 Py_DECREF(context);
    114                 if (context == value) {
    115                     PyException_SetContext(o, NULL);
    116                     break;
    117                 }
    118                 o = context;
    119             }
    120             PyException_SetContext(value, exc_value);
    121         }
    122         else {
    123             Py_DECREF(exc_value);
    124         }
    125     }
    126     if (value != NULL && PyExceptionInstance_Check(value))
    127         tb = PyException_GetTraceback(value);
    128     Py_XINCREF(exception);
    129     PyErr_Restore(exception, value, tb);
    130 }
    131 
    132 /* Set a key error with the specified argument, wrapping it in a
    133  * tuple automatically so that tuple keys are not unpacked as the
    134  * exception arguments. */
    135 void
    136 _PyErr_SetKeyError(PyObject *arg)
    137 {
    138     PyObject *tup;
    139     tup = PyTuple_Pack(1, arg);
    140     if (!tup)
    141         return; /* caller will expect error to be set anyway */
    142     PyErr_SetObject(PyExc_KeyError, tup);
    143     Py_DECREF(tup);
    144 }
    145 
    146 void
    147 PyErr_SetNone(PyObject *exception)
    148 {
    149     PyErr_SetObject(exception, (PyObject *)NULL);
    150 }
    151 
    152 void
    153 PyErr_SetString(PyObject *exception, const char *string)
    154 {
    155     PyObject *value = PyUnicode_FromString(string);
    156     PyErr_SetObject(exception, value);
    157     Py_XDECREF(value);
    158 }
    159 
    160 
    161 PyObject *
    162 PyErr_Occurred(void)
    163 {
    164     PyThreadState *tstate = _PyThreadState_UncheckedGet();
    165     return tstate == NULL ? NULL : tstate->curexc_type;
    166 }
    167 
    168 
    169 int
    170 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
    171 {
    172     if (err == NULL || exc == NULL) {
    173         /* maybe caused by "import exceptions" that failed early on */
    174         return 0;
    175     }
    176     if (PyTuple_Check(exc)) {
    177         Py_ssize_t i, n;
    178         n = PyTuple_Size(exc);
    179         for (i = 0; i < n; i++) {
    180             /* Test recursively */
    181              if (PyErr_GivenExceptionMatches(
    182                  err, PyTuple_GET_ITEM(exc, i)))
    183              {
    184                  return 1;
    185              }
    186         }
    187         return 0;
    188     }
    189     /* err might be an instance, so check its class. */
    190     if (PyExceptionInstance_Check(err))
    191         err = PyExceptionInstance_Class(err);
    192 
    193     if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
    194         int res = 0;
    195         PyObject *exception, *value, *tb;
    196         PyErr_Fetch(&exception, &value, &tb);
    197         /* PyObject_IsSubclass() can recurse and therefore is
    198            not safe (see test_bad_getattr in test.pickletester). */
    199         res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
    200         /* This function must not fail, so print the error here */
    201         if (res == -1) {
    202             PyErr_WriteUnraisable(err);
    203             res = 0;
    204         }
    205         PyErr_Restore(exception, value, tb);
    206         return res;
    207     }
    208 
    209     return err == exc;
    210 }
    211 
    212 
    213 int
    214 PyErr_ExceptionMatches(PyObject *exc)
    215 {
    216     return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
    217 }
    218 
    219 
    220 /* Used in many places to normalize a raised exception, including in
    221    eval_code2(), do_raise(), and PyErr_Print()
    222 
    223    XXX: should PyErr_NormalizeException() also call
    224             PyException_SetTraceback() with the resulting value and tb?
    225 */
    226 void
    227 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
    228 {
    229     PyObject *type = *exc;
    230     PyObject *value = *val;
    231     PyObject *inclass = NULL;
    232     PyObject *initial_tb = NULL;
    233     PyThreadState *tstate = NULL;
    234 
    235     if (type == NULL) {
    236         /* There was no exception, so nothing to do. */
    237         return;
    238     }
    239 
    240     /* If PyErr_SetNone() was used, the value will have been actually
    241        set to NULL.
    242     */
    243     if (!value) {
    244         value = Py_None;
    245         Py_INCREF(value);
    246     }
    247 
    248     if (PyExceptionInstance_Check(value))
    249         inclass = PyExceptionInstance_Class(value);
    250 
    251     /* Normalize the exception so that if the type is a class, the
    252        value will be an instance.
    253     */
    254     if (PyExceptionClass_Check(type)) {
    255         int is_subclass;
    256         if (inclass) {
    257             is_subclass = PyObject_IsSubclass(inclass, type);
    258             if (is_subclass < 0)
    259                 goto finally;
    260         }
    261         else
    262             is_subclass = 0;
    263 
    264         /* if the value was not an instance, or is not an instance
    265            whose class is (or is derived from) type, then use the
    266            value as an argument to instantiation of the type
    267            class.
    268         */
    269         if (!inclass || !is_subclass) {
    270             PyObject *fixed_value;
    271 
    272             fixed_value = _PyErr_CreateException(type, value);
    273             if (fixed_value == NULL) {
    274                 goto finally;
    275             }
    276 
    277             Py_DECREF(value);
    278             value = fixed_value;
    279         }
    280         /* if the class of the instance doesn't exactly match the
    281            class of the type, believe the instance
    282         */
    283         else if (inclass != type) {
    284             Py_DECREF(type);
    285             type = inclass;
    286             Py_INCREF(type);
    287         }
    288     }
    289     *exc = type;
    290     *val = value;
    291     return;
    292 finally:
    293     Py_DECREF(type);
    294     Py_DECREF(value);
    295     /* If the new exception doesn't set a traceback and the old
    296        exception had a traceback, use the old traceback for the
    297        new exception.  It's better than nothing.
    298     */
    299     initial_tb = *tb;
    300     PyErr_Fetch(exc, val, tb);
    301     if (initial_tb != NULL) {
    302         if (*tb == NULL)
    303             *tb = initial_tb;
    304         else
    305             Py_DECREF(initial_tb);
    306     }
    307     /* normalize recursively */
    308     tstate = PyThreadState_GET();
    309     if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
    310         --tstate->recursion_depth;
    311         /* throw away the old exception and use the recursion error instead */
    312         Py_INCREF(PyExc_RecursionError);
    313         Py_SETREF(*exc, PyExc_RecursionError);
    314         Py_INCREF(PyExc_RecursionErrorInst);
    315         Py_SETREF(*val, PyExc_RecursionErrorInst);
    316         /* just keeping the old traceback */
    317         return;
    318     }
    319     PyErr_NormalizeException(exc, val, tb);
    320     --tstate->recursion_depth;
    321 }
    322 
    323 
    324 void
    325 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
    326 {
    327     PyThreadState *tstate = PyThreadState_GET();
    328 
    329     *p_type = tstate->curexc_type;
    330     *p_value = tstate->curexc_value;
    331     *p_traceback = tstate->curexc_traceback;
    332 
    333     tstate->curexc_type = NULL;
    334     tstate->curexc_value = NULL;
    335     tstate->curexc_traceback = NULL;
    336 }
    337 
    338 void
    339 PyErr_Clear(void)
    340 {
    341     PyErr_Restore(NULL, NULL, NULL);
    342 }
    343 
    344 void
    345 PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
    346 {
    347     PyThreadState *tstate = PyThreadState_GET();
    348 
    349     *p_type = tstate->exc_type;
    350     *p_value = tstate->exc_value;
    351     *p_traceback = tstate->exc_traceback;
    352 
    353     Py_XINCREF(*p_type);
    354     Py_XINCREF(*p_value);
    355     Py_XINCREF(*p_traceback);
    356 }
    357 
    358 void
    359 PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
    360 {
    361     PyObject *oldtype, *oldvalue, *oldtraceback;
    362     PyThreadState *tstate = PyThreadState_GET();
    363 
    364     oldtype = tstate->exc_type;
    365     oldvalue = tstate->exc_value;
    366     oldtraceback = tstate->exc_traceback;
    367 
    368     tstate->exc_type = p_type;
    369     tstate->exc_value = p_value;
    370     tstate->exc_traceback = p_traceback;
    371 
    372     Py_XDECREF(oldtype);
    373     Py_XDECREF(oldvalue);
    374     Py_XDECREF(oldtraceback);
    375 }
    376 
    377 /* Like PyErr_Restore(), but if an exception is already set,
    378    set the context associated with it.
    379  */
    380 void
    381 _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
    382 {
    383     if (exc == NULL)
    384         return;
    385 
    386     if (PyErr_Occurred()) {
    387         PyObject *exc2, *val2, *tb2;
    388         PyErr_Fetch(&exc2, &val2, &tb2);
    389         PyErr_NormalizeException(&exc, &val, &tb);
    390         if (tb != NULL) {
    391             PyException_SetTraceback(val, tb);
    392             Py_DECREF(tb);
    393         }
    394         Py_DECREF(exc);
    395         PyErr_NormalizeException(&exc2, &val2, &tb2);
    396         PyException_SetContext(val2, val);
    397         PyErr_Restore(exc2, val2, tb2);
    398     }
    399     else {
    400         PyErr_Restore(exc, val, tb);
    401     }
    402 }
    403 
    404 static PyObject *
    405 _PyErr_FormatVFromCause(PyObject *exception, const char *format, va_list vargs)
    406 {
    407     PyObject *exc, *val, *val2, *tb;
    408 
    409     assert(PyErr_Occurred());
    410     PyErr_Fetch(&exc, &val, &tb);
    411     PyErr_NormalizeException(&exc, &val, &tb);
    412     if (tb != NULL) {
    413         PyException_SetTraceback(val, tb);
    414         Py_DECREF(tb);
    415     }
    416     Py_DECREF(exc);
    417     assert(!PyErr_Occurred());
    418 
    419     PyErr_FormatV(exception, format, vargs);
    420 
    421     PyErr_Fetch(&exc, &val2, &tb);
    422     PyErr_NormalizeException(&exc, &val2, &tb);
    423     Py_INCREF(val);
    424     PyException_SetCause(val2, val);
    425     PyException_SetContext(val2, val);
    426     PyErr_Restore(exc, val2, tb);
    427 
    428     return NULL;
    429 }
    430 
    431 PyObject *
    432 _PyErr_FormatFromCause(PyObject *exception, const char *format, ...)
    433 {
    434     va_list vargs;
    435 #ifdef HAVE_STDARG_PROTOTYPES
    436     va_start(vargs, format);
    437 #else
    438     va_start(vargs);
    439 #endif
    440     _PyErr_FormatVFromCause(exception, format, vargs);
    441     va_end(vargs);
    442     return NULL;
    443 }
    444 
    445 /* Convenience functions to set a type error exception and return 0 */
    446 
    447 int
    448 PyErr_BadArgument(void)
    449 {
    450     PyErr_SetString(PyExc_TypeError,
    451                     "bad argument type for built-in operation");
    452     return 0;
    453 }
    454 
    455 PyObject *
    456 PyErr_NoMemory(void)
    457 {
    458     if (Py_TYPE(PyExc_MemoryError) == NULL) {
    459         /* PyErr_NoMemory() has been called before PyExc_MemoryError has been
    460            initialized by _PyExc_Init() */
    461         Py_FatalError("Out of memory and PyExc_MemoryError is not "
    462                       "initialized yet");
    463     }
    464     PyErr_SetNone(PyExc_MemoryError);
    465     return NULL;
    466 }
    467 
    468 PyObject *
    469 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
    470 {
    471     return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL);
    472 }
    473 
    474 PyObject *
    475 PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2)
    476 {
    477     PyObject *message;
    478     PyObject *v, *args;
    479     int i = errno;
    480 #ifdef MS_WINDOWS
    481     WCHAR *s_buf = NULL;
    482 #endif /* Unix/Windows */
    483 
    484 #ifdef EINTR
    485     if (i == EINTR && PyErr_CheckSignals())
    486         return NULL;
    487 #endif
    488 
    489 #ifndef MS_WINDOWS
    490     if (i != 0) {
    491         char *s = strerror(i);
    492         message = PyUnicode_DecodeLocale(s, "surrogateescape");
    493     }
    494     else {
    495         /* Sometimes errno didn't get set */
    496         message = PyUnicode_FromString("Error");
    497     }
    498 #else
    499     if (i == 0)
    500         message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
    501     else
    502     {
    503         /* Note that the Win32 errors do not lineup with the
    504            errno error.  So if the error is in the MSVC error
    505            table, we use it, otherwise we assume it really _is_
    506            a Win32 error code
    507         */
    508         if (i > 0 && i < _sys_nerr) {
    509             message = PyUnicode_FromString(_sys_errlist[i]);
    510         }
    511         else {
    512             int len = FormatMessageW(
    513                 FORMAT_MESSAGE_ALLOCATE_BUFFER |
    514                 FORMAT_MESSAGE_FROM_SYSTEM |
    515                 FORMAT_MESSAGE_IGNORE_INSERTS,
    516                 NULL,                   /* no message source */
    517                 i,
    518                 MAKELANGID(LANG_NEUTRAL,
    519                            SUBLANG_DEFAULT),
    520                            /* Default language */
    521                 (LPWSTR) &s_buf,
    522                 0,                      /* size not used */
    523                 NULL);                  /* no args */
    524             if (len==0) {
    525                 /* Only ever seen this in out-of-mem
    526                    situations */
    527                 s_buf = NULL;
    528                 message = PyUnicode_FromFormat("Windows Error 0x%x", i);
    529             } else {
    530                 /* remove trailing cr/lf and dots */
    531                 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
    532                     s_buf[--len] = L'\0';
    533                 message = PyUnicode_FromWideChar(s_buf, len);
    534             }
    535         }
    536     }
    537 #endif /* Unix/Windows */
    538 
    539     if (message == NULL)
    540     {
    541 #ifdef MS_WINDOWS
    542         LocalFree(s_buf);
    543 #endif
    544         return NULL;
    545     }
    546 
    547     if (filenameObject != NULL) {
    548         if (filenameObject2 != NULL)
    549             args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2);
    550         else
    551             args = Py_BuildValue("(iOO)", i, message, filenameObject);
    552     } else {
    553         assert(filenameObject2 == NULL);
    554         args = Py_BuildValue("(iO)", i, message);
    555     }
    556     Py_DECREF(message);
    557 
    558     if (args != NULL) {
    559         v = PyObject_Call(exc, args, NULL);
    560         Py_DECREF(args);
    561         if (v != NULL) {
    562             PyErr_SetObject((PyObject *) Py_TYPE(v), v);
    563             Py_DECREF(v);
    564         }
    565     }
    566 #ifdef MS_WINDOWS
    567     LocalFree(s_buf);
    568 #endif
    569     return NULL;
    570 }
    571 
    572 PyObject *
    573 PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
    574 {
    575     PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
    576     PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
    577     Py_XDECREF(name);
    578     return result;
    579 }
    580 
    581 #ifdef MS_WINDOWS
    582 PyObject *
    583 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
    584 {
    585     PyObject *name = filename ?
    586                      PyUnicode_FromUnicode(filename, wcslen(filename)) :
    587              NULL;
    588     PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
    589     Py_XDECREF(name);
    590     return result;
    591 }
    592 #endif /* MS_WINDOWS */
    593 
    594 PyObject *
    595 PyErr_SetFromErrno(PyObject *exc)
    596 {
    597     return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL);
    598 }
    599 
    600 #ifdef MS_WINDOWS
    601 /* Windows specific error code handling */
    602 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
    603     PyObject *exc,
    604     int ierr,
    605     PyObject *filenameObject)
    606 {
    607     return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr,
    608         filenameObject, NULL);
    609 }
    610 
    611 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
    612     PyObject *exc,
    613     int ierr,
    614     PyObject *filenameObject,
    615     PyObject *filenameObject2)
    616 {
    617     int len;
    618     WCHAR *s_buf = NULL; /* Free via LocalFree */
    619     PyObject *message;
    620     PyObject *args, *v;
    621     DWORD err = (DWORD)ierr;
    622     if (err==0) err = GetLastError();
    623     len = FormatMessageW(
    624         /* Error API error */
    625         FORMAT_MESSAGE_ALLOCATE_BUFFER |
    626         FORMAT_MESSAGE_FROM_SYSTEM |
    627         FORMAT_MESSAGE_IGNORE_INSERTS,
    628         NULL,           /* no message source */
    629         err,
    630         MAKELANGID(LANG_NEUTRAL,
    631         SUBLANG_DEFAULT), /* Default language */
    632         (LPWSTR) &s_buf,
    633         0,              /* size not used */
    634         NULL);          /* no args */
    635     if (len==0) {
    636         /* Only seen this in out of mem situations */
    637         message = PyUnicode_FromFormat("Windows Error 0x%x", err);
    638         s_buf = NULL;
    639     } else {
    640         /* remove trailing cr/lf and dots */
    641         while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
    642             s_buf[--len] = L'\0';
    643         message = PyUnicode_FromWideChar(s_buf, len);
    644     }
    645 
    646     if (message == NULL)
    647     {
    648         LocalFree(s_buf);
    649         return NULL;
    650     }
    651 
    652     if (filenameObject == NULL) {
    653         assert(filenameObject2 == NULL);
    654         filenameObject = filenameObject2 = Py_None;
    655     }
    656     else if (filenameObject2 == NULL)
    657         filenameObject2 = Py_None;
    658     /* This is the constructor signature for OSError.
    659        The POSIX translation will be figured out by the constructor. */
    660     args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2);
    661     Py_DECREF(message);
    662 
    663     if (args != NULL) {
    664         v = PyObject_Call(exc, args, NULL);
    665         Py_DECREF(args);
    666         if (v != NULL) {
    667             PyErr_SetObject((PyObject *) Py_TYPE(v), v);
    668             Py_DECREF(v);
    669         }
    670     }
    671     LocalFree(s_buf);
    672     return NULL;
    673 }
    674 
    675 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
    676     PyObject *exc,
    677     int ierr,
    678     const char *filename)
    679 {
    680     PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
    681     PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
    682                                                                  ierr,
    683                                                                  name,
    684                                                                  NULL);
    685     Py_XDECREF(name);
    686     return ret;
    687 }
    688 
    689 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
    690     PyObject *exc,
    691     int ierr,
    692     const Py_UNICODE *filename)
    693 {
    694     PyObject *name = filename ?
    695                      PyUnicode_FromUnicode(filename, wcslen(filename)) :
    696              NULL;
    697     PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
    698                                                                  ierr,
    699                                                                  name,
    700                                                                  NULL);
    701     Py_XDECREF(name);
    702     return ret;
    703 }
    704 
    705 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
    706 {
    707     return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
    708 }
    709 
    710 PyObject *PyErr_SetFromWindowsErr(int ierr)
    711 {
    712     return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
    713                                                   ierr, NULL);
    714 }
    715 
    716 PyObject *PyErr_SetFromWindowsErrWithFilename(
    717     int ierr,
    718     const char *filename)
    719 {
    720     PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
    721     PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
    722                                                   PyExc_OSError,
    723                                                   ierr, name, NULL);
    724     Py_XDECREF(name);
    725     return result;
    726 }
    727 
    728 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
    729     int ierr,
    730     const Py_UNICODE *filename)
    731 {
    732     PyObject *name = filename ?
    733                      PyUnicode_FromUnicode(filename, wcslen(filename)) :
    734              NULL;
    735     PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
    736                                                   PyExc_OSError,
    737                                                   ierr, name, NULL);
    738     Py_XDECREF(name);
    739     return result;
    740 }
    741 #endif /* MS_WINDOWS */
    742 
    743 PyObject *
    744 PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
    745     PyObject *name, PyObject *path)
    746 {
    747     int issubclass;
    748     PyObject *kwargs, *error;
    749 
    750     issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
    751     if (issubclass < 0) {
    752         return NULL;
    753     }
    754     else if (!issubclass) {
    755         PyErr_SetString(PyExc_TypeError, "expected a subclass of ImportError");
    756         return NULL;
    757     }
    758 
    759     if (msg == NULL) {
    760         PyErr_SetString(PyExc_TypeError, "expected a message argument");
    761         return NULL;
    762     }
    763 
    764     if (name == NULL) {
    765         name = Py_None;
    766     }
    767     if (path == NULL) {
    768         path = Py_None;
    769     }
    770 
    771     kwargs = PyDict_New();
    772     if (kwargs == NULL) {
    773         return NULL;
    774     }
    775     if (PyDict_SetItemString(kwargs, "name", name) < 0) {
    776         goto done;
    777     }
    778     if (PyDict_SetItemString(kwargs, "path", path) < 0) {
    779         goto done;
    780     }
    781 
    782     error = _PyObject_FastCallDict(exception, &msg, 1, kwargs);
    783     if (error != NULL) {
    784         PyErr_SetObject((PyObject *)Py_TYPE(error), error);
    785         Py_DECREF(error);
    786     }
    787 
    788 done:
    789     Py_DECREF(kwargs);
    790     return NULL;
    791 }
    792 
    793 PyObject *
    794 PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
    795 {
    796     return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
    797 }
    798 
    799 void
    800 _PyErr_BadInternalCall(const char *filename, int lineno)
    801 {
    802     PyErr_Format(PyExc_SystemError,
    803                  "%s:%d: bad argument to internal function",
    804                  filename, lineno);
    805 }
    806 
    807 /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
    808    export the entry point for existing object code: */
    809 #undef PyErr_BadInternalCall
    810 void
    811 PyErr_BadInternalCall(void)
    812 {
    813     assert(0 && "bad argument to internal function");
    814     PyErr_Format(PyExc_SystemError,
    815                  "bad argument to internal function");
    816 }
    817 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
    818 
    819 
    820 PyObject *
    821 PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
    822 {
    823     PyObject* string;
    824 
    825     /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
    826        exception set, it calls arbitrary Python code like PyObject_Repr() */
    827     PyErr_Clear();
    828 
    829     string = PyUnicode_FromFormatV(format, vargs);
    830 
    831     PyErr_SetObject(exception, string);
    832     Py_XDECREF(string);
    833     return NULL;
    834 }
    835 
    836 
    837 PyObject *
    838 PyErr_Format(PyObject *exception, const char *format, ...)
    839 {
    840     va_list vargs;
    841 #ifdef HAVE_STDARG_PROTOTYPES
    842     va_start(vargs, format);
    843 #else
    844     va_start(vargs);
    845 #endif
    846     PyErr_FormatV(exception, format, vargs);
    847     va_end(vargs);
    848     return NULL;
    849 }
    850 
    851 
    852 PyObject *
    853 PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
    854 {
    855     const char *dot;
    856     PyObject *modulename = NULL;
    857     PyObject *classname = NULL;
    858     PyObject *mydict = NULL;
    859     PyObject *bases = NULL;
    860     PyObject *result = NULL;
    861     dot = strrchr(name, '.');
    862     if (dot == NULL) {
    863         PyErr_SetString(PyExc_SystemError,
    864             "PyErr_NewException: name must be module.class");
    865         return NULL;
    866     }
    867     if (base == NULL)
    868         base = PyExc_Exception;
    869     if (dict == NULL) {
    870         dict = mydict = PyDict_New();
    871         if (dict == NULL)
    872             goto failure;
    873     }
    874     if (PyDict_GetItemString(dict, "__module__") == NULL) {
    875         modulename = PyUnicode_FromStringAndSize(name,
    876                                              (Py_ssize_t)(dot-name));
    877         if (modulename == NULL)
    878             goto failure;
    879         if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
    880             goto failure;
    881     }
    882     if (PyTuple_Check(base)) {
    883         bases = base;
    884         /* INCREF as we create a new ref in the else branch */
    885         Py_INCREF(bases);
    886     } else {
    887         bases = PyTuple_Pack(1, base);
    888         if (bases == NULL)
    889             goto failure;
    890     }
    891     /* Create a real class. */
    892     result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
    893                                    dot+1, bases, dict);
    894   failure:
    895     Py_XDECREF(bases);
    896     Py_XDECREF(mydict);
    897     Py_XDECREF(classname);
    898     Py_XDECREF(modulename);
    899     return result;
    900 }
    901 
    902 
    903 /* Create an exception with docstring */
    904 PyObject *
    905 PyErr_NewExceptionWithDoc(const char *name, const char *doc,
    906                           PyObject *base, PyObject *dict)
    907 {
    908     int result;
    909     PyObject *ret = NULL;
    910     PyObject *mydict = NULL; /* points to the dict only if we create it */
    911     PyObject *docobj;
    912 
    913     if (dict == NULL) {
    914         dict = mydict = PyDict_New();
    915         if (dict == NULL) {
    916             return NULL;
    917         }
    918     }
    919 
    920     if (doc != NULL) {
    921         docobj = PyUnicode_FromString(doc);
    922         if (docobj == NULL)
    923             goto failure;
    924         result = PyDict_SetItemString(dict, "__doc__", docobj);
    925         Py_DECREF(docobj);
    926         if (result < 0)
    927             goto failure;
    928     }
    929 
    930     ret = PyErr_NewException(name, base, dict);
    931   failure:
    932     Py_XDECREF(mydict);
    933     return ret;
    934 }
    935 
    936 
    937 /* Call when an exception has occurred but there is no way for Python
    938    to handle it.  Examples: exception in __del__ or during GC. */
    939 void
    940 PyErr_WriteUnraisable(PyObject *obj)
    941 {
    942     _Py_IDENTIFIER(__module__);
    943     PyObject *f, *t, *v, *tb;
    944     PyObject *moduleName = NULL;
    945     char* className;
    946 
    947     PyErr_Fetch(&t, &v, &tb);
    948 
    949     f = _PySys_GetObjectId(&PyId_stderr);
    950     if (f == NULL || f == Py_None)
    951         goto done;
    952 
    953     if (obj) {
    954         if (PyFile_WriteString("Exception ignored in: ", f) < 0)
    955             goto done;
    956         if (PyFile_WriteObject(obj, f, 0) < 0) {
    957             PyErr_Clear();
    958             if (PyFile_WriteString("<object repr() failed>", f) < 0) {
    959                 goto done;
    960             }
    961         }
    962         if (PyFile_WriteString("\n", f) < 0)
    963             goto done;
    964     }
    965 
    966     if (PyTraceBack_Print(tb, f) < 0)
    967         goto done;
    968 
    969     if (!t)
    970         goto done;
    971 
    972     assert(PyExceptionClass_Check(t));
    973     className = PyExceptionClass_Name(t);
    974     if (className != NULL) {
    975         char *dot = strrchr(className, '.');
    976         if (dot != NULL)
    977             className = dot+1;
    978     }
    979 
    980     moduleName = _PyObject_GetAttrId(t, &PyId___module__);
    981     if (moduleName == NULL) {
    982         PyErr_Clear();
    983         if (PyFile_WriteString("<unknown>", f) < 0)
    984             goto done;
    985     }
    986     else {
    987         if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) {
    988             if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0)
    989                 goto done;
    990             if (PyFile_WriteString(".", f) < 0)
    991                 goto done;
    992         }
    993     }
    994     if (className == NULL) {
    995         if (PyFile_WriteString("<unknown>", f) < 0)
    996             goto done;
    997     }
    998     else {
    999         if (PyFile_WriteString(className, f) < 0)
   1000             goto done;
   1001     }
   1002 
   1003     if (v && v != Py_None) {
   1004         if (PyFile_WriteString(": ", f) < 0)
   1005             goto done;
   1006         if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) {
   1007             PyErr_Clear();
   1008             if (PyFile_WriteString("<exception str() failed>", f) < 0) {
   1009                 goto done;
   1010             }
   1011         }
   1012     }
   1013     if (PyFile_WriteString("\n", f) < 0)
   1014         goto done;
   1015 
   1016 done:
   1017     Py_XDECREF(moduleName);
   1018     Py_XDECREF(t);
   1019     Py_XDECREF(v);
   1020     Py_XDECREF(tb);
   1021     PyErr_Clear(); /* Just in case */
   1022 }
   1023 
   1024 extern PyObject *PyModule_GetWarningsModule(void);
   1025 
   1026 
   1027 void
   1028 PyErr_SyntaxLocation(const char *filename, int lineno)
   1029 {
   1030     PyErr_SyntaxLocationEx(filename, lineno, -1);
   1031 }
   1032 
   1033 
   1034 /* Set file and line information for the current exception.
   1035    If the exception is not a SyntaxError, also sets additional attributes
   1036    to make printing of exceptions believe it is a syntax error. */
   1037 
   1038 void
   1039 PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
   1040 {
   1041     PyObject *exc, *v, *tb, *tmp;
   1042     _Py_IDENTIFIER(filename);
   1043     _Py_IDENTIFIER(lineno);
   1044     _Py_IDENTIFIER(msg);
   1045     _Py_IDENTIFIER(offset);
   1046     _Py_IDENTIFIER(print_file_and_line);
   1047     _Py_IDENTIFIER(text);
   1048 
   1049     /* add attributes for the line number and filename for the error */
   1050     PyErr_Fetch(&exc, &v, &tb);
   1051     PyErr_NormalizeException(&exc, &v, &tb);
   1052     /* XXX check that it is, indeed, a syntax error. It might not
   1053      * be, though. */
   1054     tmp = PyLong_FromLong(lineno);
   1055     if (tmp == NULL)
   1056         PyErr_Clear();
   1057     else {
   1058         if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
   1059             PyErr_Clear();
   1060         Py_DECREF(tmp);
   1061     }
   1062     tmp = NULL;
   1063     if (col_offset >= 0) {
   1064         tmp = PyLong_FromLong(col_offset);
   1065         if (tmp == NULL)
   1066             PyErr_Clear();
   1067     }
   1068     if (_PyObject_SetAttrId(v, &PyId_offset, tmp ? tmp : Py_None))
   1069         PyErr_Clear();
   1070     Py_XDECREF(tmp);
   1071     if (filename != NULL) {
   1072         if (_PyObject_SetAttrId(v, &PyId_filename, filename))
   1073             PyErr_Clear();
   1074 
   1075         tmp = PyErr_ProgramTextObject(filename, lineno);
   1076         if (tmp) {
   1077             if (_PyObject_SetAttrId(v, &PyId_text, tmp))
   1078                 PyErr_Clear();
   1079             Py_DECREF(tmp);
   1080         }
   1081     }
   1082     if (exc != PyExc_SyntaxError) {
   1083         if (!_PyObject_HasAttrId(v, &PyId_msg)) {
   1084             tmp = PyObject_Str(v);
   1085             if (tmp) {
   1086                 if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
   1087                     PyErr_Clear();
   1088                 Py_DECREF(tmp);
   1089             } else {
   1090                 PyErr_Clear();
   1091             }
   1092         }
   1093         if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
   1094             if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
   1095                                     Py_None))
   1096                 PyErr_Clear();
   1097         }
   1098     }
   1099     PyErr_Restore(exc, v, tb);
   1100 }
   1101 
   1102 void
   1103 PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
   1104 {
   1105     PyObject *fileobj;
   1106     if (filename != NULL) {
   1107         fileobj = PyUnicode_DecodeFSDefault(filename);
   1108         if (fileobj == NULL)
   1109             PyErr_Clear();
   1110     }
   1111     else
   1112         fileobj = NULL;
   1113     PyErr_SyntaxLocationObject(fileobj, lineno, col_offset);
   1114     Py_XDECREF(fileobj);
   1115 }
   1116 
   1117 /* Attempt to load the line of text that the exception refers to.  If it
   1118    fails, it will return NULL but will not set an exception.
   1119 
   1120    XXX The functionality of this function is quite similar to the
   1121    functionality in tb_displayline() in traceback.c. */
   1122 
   1123 static PyObject *
   1124 err_programtext(FILE *fp, int lineno)
   1125 {
   1126     int i;
   1127     char linebuf[1000];
   1128 
   1129     if (fp == NULL)
   1130         return NULL;
   1131     for (i = 0; i < lineno; i++) {
   1132         char *pLastChar = &linebuf[sizeof(linebuf) - 2];
   1133         do {
   1134             *pLastChar = '\0';
   1135             if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
   1136                                          fp, NULL) == NULL)
   1137                 break;
   1138             /* fgets read *something*; if it didn't get as
   1139                far as pLastChar, it must have found a newline
   1140                or hit the end of the file; if pLastChar is \n,
   1141                it obviously found a newline; else we haven't
   1142                yet seen a newline, so must continue */
   1143         } while (*pLastChar != '\0' && *pLastChar != '\n');
   1144     }
   1145     fclose(fp);
   1146     if (i == lineno) {
   1147         PyObject *res;
   1148         res = PyUnicode_FromString(linebuf);
   1149         if (res == NULL)
   1150             PyErr_Clear();
   1151         return res;
   1152     }
   1153     return NULL;
   1154 }
   1155 
   1156 PyObject *
   1157 PyErr_ProgramText(const char *filename, int lineno)
   1158 {
   1159     FILE *fp;
   1160     if (filename == NULL || *filename == '\0' || lineno <= 0)
   1161         return NULL;
   1162     fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE);
   1163     return err_programtext(fp, lineno);
   1164 }
   1165 
   1166 PyObject *
   1167 PyErr_ProgramTextObject(PyObject *filename, int lineno)
   1168 {
   1169     FILE *fp;
   1170     if (filename == NULL || lineno <= 0)
   1171         return NULL;
   1172     fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
   1173     if (fp == NULL) {
   1174         PyErr_Clear();
   1175         return NULL;
   1176     }
   1177     return err_programtext(fp, lineno);
   1178 }
   1179 
   1180 #ifdef __cplusplus
   1181 }
   1182 #endif
   1183