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