errors.c revision 2b6727bd8a714d334d34e6a9fabc1d0f651633a7
1 2/* Error handling */ 3 4#include "Python.h" 5 6#ifdef macintosh 7extern char *PyMac_StrError(int); 8#undef strerror 9#define strerror PyMac_StrError 10#endif /* macintosh */ 11 12#ifndef __STDC__ 13#ifndef MS_WINDOWS 14extern char *strerror(int); 15#endif 16#endif 17 18#ifdef MS_WIN32 19#include "windows.h" 20#include "winbase.h" 21#endif 22 23#include <ctype.h> 24 25void 26PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) 27{ 28 PyThreadState *tstate = PyThreadState_GET(); 29 PyObject *oldtype, *oldvalue, *oldtraceback; 30 31 if (traceback != NULL && !PyTraceBack_Check(traceback)) { 32 /* XXX Should never happen -- fatal error instead? */ 33 Py_DECREF(traceback); 34 traceback = NULL; 35 } 36 37 /* Save these in locals to safeguard against recursive 38 invocation through Py_XDECREF */ 39 oldtype = tstate->curexc_type; 40 oldvalue = tstate->curexc_value; 41 oldtraceback = tstate->curexc_traceback; 42 43 tstate->curexc_type = type; 44 tstate->curexc_value = value; 45 tstate->curexc_traceback = traceback; 46 47 Py_XDECREF(oldtype); 48 Py_XDECREF(oldvalue); 49 Py_XDECREF(oldtraceback); 50} 51 52void 53PyErr_SetObject(PyObject *exception, PyObject *value) 54{ 55 Py_XINCREF(exception); 56 Py_XINCREF(value); 57 PyErr_Restore(exception, value, (PyObject *)NULL); 58} 59 60void 61PyErr_SetNone(PyObject *exception) 62{ 63 PyErr_SetObject(exception, (PyObject *)NULL); 64} 65 66void 67PyErr_SetString(PyObject *exception, const char *string) 68{ 69 PyObject *value = PyString_FromString(string); 70 PyErr_SetObject(exception, value); 71 Py_XDECREF(value); 72} 73 74 75PyObject * 76PyErr_Occurred(void) 77{ 78 PyThreadState *tstate = PyThreadState_Get(); 79 80 return tstate->curexc_type; 81} 82 83 84int 85PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) 86{ 87 if (err == NULL || exc == NULL) { 88 /* maybe caused by "import exceptions" that failed early on */ 89 return 0; 90 } 91 if (PyTuple_Check(exc)) { 92 int i, n; 93 n = PyTuple_Size(exc); 94 for (i = 0; i < n; i++) { 95 /* Test recursively */ 96 if (PyErr_GivenExceptionMatches( 97 err, PyTuple_GET_ITEM(exc, i))) 98 { 99 return 1; 100 } 101 } 102 return 0; 103 } 104 /* err might be an instance, so check its class. */ 105 if (PyInstance_Check(err)) 106 err = (PyObject*)((PyInstanceObject*)err)->in_class; 107 108 if (PyClass_Check(err) && PyClass_Check(exc)) 109 return PyClass_IsSubclass(err, exc); 110 111 return err == exc; 112} 113 114 115int 116PyErr_ExceptionMatches(PyObject *exc) 117{ 118 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc); 119} 120 121 122/* Used in many places to normalize a raised exception, including in 123 eval_code2(), do_raise(), and PyErr_Print() 124*/ 125void 126PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) 127{ 128 PyObject *type = *exc; 129 PyObject *value = *val; 130 PyObject *inclass = NULL; 131 132 if (type == NULL) { 133 /* This is a bug. Should never happen. Don't dump core. */ 134 PyErr_SetString(PyExc_SystemError, 135 "PyErr_NormalizeException() called without exception"); 136 } 137 138 /* If PyErr_SetNone() was used, the value will have been actually 139 set to NULL. 140 */ 141 if (!value) { 142 value = Py_None; 143 Py_INCREF(value); 144 } 145 146 if (PyInstance_Check(value)) 147 inclass = (PyObject*)((PyInstanceObject*)value)->in_class; 148 149 /* Normalize the exception so that if the type is a class, the 150 value will be an instance. 151 */ 152 if (PyClass_Check(type)) { 153 /* if the value was not an instance, or is not an instance 154 whose class is (or is derived from) type, then use the 155 value as an argument to instantiation of the type 156 class. 157 */ 158 if (!inclass || !PyClass_IsSubclass(inclass, type)) { 159 PyObject *args, *res; 160 161 if (value == Py_None) 162 args = Py_BuildValue("()"); 163 else if (PyTuple_Check(value)) { 164 Py_INCREF(value); 165 args = value; 166 } 167 else 168 args = Py_BuildValue("(O)", value); 169 170 if (args == NULL) 171 goto finally; 172 res = PyEval_CallObject(type, args); 173 Py_DECREF(args); 174 if (res == NULL) 175 goto finally; 176 Py_DECREF(value); 177 value = res; 178 } 179 /* if the class of the instance doesn't exactly match the 180 class of the type, believe the instance 181 */ 182 else if (inclass != type) { 183 Py_DECREF(type); 184 type = inclass; 185 Py_INCREF(type); 186 } 187 } 188 *exc = type; 189 *val = value; 190 return; 191finally: 192 Py_DECREF(type); 193 Py_DECREF(value); 194 Py_XDECREF(*tb); 195 PyErr_Fetch(exc, val, tb); 196 /* normalize recursively */ 197 PyErr_NormalizeException(exc, val, tb); 198} 199 200 201void 202PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) 203{ 204 PyThreadState *tstate = PyThreadState_Get(); 205 206 *p_type = tstate->curexc_type; 207 *p_value = tstate->curexc_value; 208 *p_traceback = tstate->curexc_traceback; 209 210 tstate->curexc_type = NULL; 211 tstate->curexc_value = NULL; 212 tstate->curexc_traceback = NULL; 213} 214 215void 216PyErr_Clear(void) 217{ 218 PyErr_Restore(NULL, NULL, NULL); 219} 220 221/* Convenience functions to set a type error exception and return 0 */ 222 223int 224PyErr_BadArgument(void) 225{ 226 PyErr_SetString(PyExc_TypeError, 227 "bad argument type for built-in operation"); 228 return 0; 229} 230 231PyObject * 232PyErr_NoMemory(void) 233{ 234 if (PyErr_ExceptionMatches(PyExc_MemoryError)) 235 /* already current */ 236 return NULL; 237 238 /* raise the pre-allocated instance if it still exists */ 239 if (PyExc_MemoryErrorInst) 240 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst); 241 else 242 /* this will probably fail since there's no memory and hee, 243 hee, we have to instantiate this class 244 */ 245 PyErr_SetNone(PyExc_MemoryError); 246 247 return NULL; 248} 249 250PyObject * 251PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename) 252{ 253 PyObject *v; 254 char *s; 255 int i = errno; 256#ifdef MS_WIN32 257 char *s_buf = NULL; 258#endif 259#ifdef EINTR 260 if (i == EINTR && PyErr_CheckSignals()) 261 return NULL; 262#endif 263 if (i == 0) 264 s = "Error"; /* Sometimes errno didn't get set */ 265 else 266#ifndef MS_WIN32 267 s = strerror(i); 268#else 269 { 270 /* Note that the Win32 errors do not lineup with the 271 errno error. So if the error is in the MSVC error 272 table, we use it, otherwise we assume it really _is_ 273 a Win32 error code 274 */ 275 if (i > 0 && i < _sys_nerr) { 276 s = _sys_errlist[i]; 277 } 278 else { 279 int len = FormatMessage( 280 FORMAT_MESSAGE_ALLOCATE_BUFFER | 281 FORMAT_MESSAGE_FROM_SYSTEM | 282 FORMAT_MESSAGE_IGNORE_INSERTS, 283 NULL, /* no message source */ 284 i, 285 MAKELANGID(LANG_NEUTRAL, 286 SUBLANG_DEFAULT), 287 /* Default language */ 288 (LPTSTR) &s_buf, 289 0, /* size not used */ 290 NULL); /* no args */ 291 s = s_buf; 292 /* remove trailing cr/lf and dots */ 293 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) 294 s[--len] = '\0'; 295 } 296 } 297#endif 298 if (filename != NULL) 299 v = Py_BuildValue("(iss)", i, s, filename); 300 else 301 v = Py_BuildValue("(is)", i, s); 302 if (v != NULL) { 303 PyErr_SetObject(exc, v); 304 Py_DECREF(v); 305 } 306#ifdef MS_WIN32 307 LocalFree(s_buf); 308#endif 309 return NULL; 310} 311 312 313PyObject * 314PyErr_SetFromErrno(PyObject *exc) 315{ 316 return PyErr_SetFromErrnoWithFilename(exc, NULL); 317} 318 319#ifdef MS_WINDOWS 320/* Windows specific error code handling */ 321PyObject *PyErr_SetFromWindowsErrWithFilename( 322 int ierr, 323 const char *filename) 324{ 325 int len; 326 char *s; 327 PyObject *v; 328 DWORD err = (DWORD)ierr; 329 if (err==0) err = GetLastError(); 330 len = FormatMessage( 331 /* Error API error */ 332 FORMAT_MESSAGE_ALLOCATE_BUFFER | 333 FORMAT_MESSAGE_FROM_SYSTEM | 334 FORMAT_MESSAGE_IGNORE_INSERTS, 335 NULL, /* no message source */ 336 err, 337 MAKELANGID(LANG_NEUTRAL, 338 SUBLANG_DEFAULT), /* Default language */ 339 (LPTSTR) &s, 340 0, /* size not used */ 341 NULL); /* no args */ 342 /* remove trailing cr/lf and dots */ 343 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) 344 s[--len] = '\0'; 345 if (filename != NULL) 346 v = Py_BuildValue("(iss)", err, s, filename); 347 else 348 v = Py_BuildValue("(is)", err, s); 349 if (v != NULL) { 350 PyErr_SetObject(PyExc_WindowsError, v); 351 Py_DECREF(v); 352 } 353 LocalFree(s); 354 return NULL; 355} 356 357PyObject *PyErr_SetFromWindowsErr(int ierr) 358{ 359 return PyErr_SetFromWindowsErrWithFilename(ierr, NULL); 360} 361#endif /* MS_WINDOWS */ 362 363void 364_PyErr_BadInternalCall(char *filename, int lineno) 365{ 366 PyErr_Format(PyExc_SystemError, 367 "%s:%d: bad argument to internal function", 368 filename, lineno); 369} 370 371/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can 372 export the entry point for existing object code: */ 373#undef PyErr_BadInternalCall 374void 375PyErr_BadInternalCall(void) 376{ 377 PyErr_Format(PyExc_SystemError, 378 "bad argument to internal function"); 379} 380#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) 381 382 383 384PyObject * 385PyErr_Format(PyObject *exception, const char *format, ...) 386{ 387 va_list vargs; 388 int n, i; 389 const char* f; 390 char* s; 391 PyObject* string; 392 393 /* step 1: figure out how large a buffer we need */ 394 395#ifdef HAVE_STDARG_PROTOTYPES 396 va_start(vargs, format); 397#else 398 va_start(vargs); 399#endif 400 401 n = 0; 402 for (f = format; *f; f++) { 403 if (*f == '%') { 404 const char* p = f; 405 while (*++f && *f != '%' && !isalpha(Py_CHARMASK(*f))) 406 ; 407 switch (*f) { 408 case 'c': 409 (void) va_arg(vargs, int); 410 /* fall through... */ 411 case '%': 412 n++; 413 break; 414 case 'd': case 'i': case 'x': 415 (void) va_arg(vargs, int); 416 /* 20 bytes should be enough to hold a 64-bit 417 integer */ 418 n = n + 20; 419 break; 420 case 's': 421 s = va_arg(vargs, char*); 422 n = n + strlen(s); 423 break; 424 default: 425 /* if we stumble upon an unknown 426 formatting code, copy the rest of 427 the format string to the output 428 string. (we cannot just skip the 429 code, since there's no way to know 430 what's in the argument list) */ 431 n = n + strlen(p); 432 goto expand; 433 } 434 } else 435 n = n + 1; 436 } 437 438 expand: 439 440 string = PyString_FromStringAndSize(NULL, n); 441 if (!string) 442 return NULL; 443 444#ifdef HAVE_STDARG_PROTOTYPES 445 va_start(vargs, format); 446#else 447 va_start(vargs); 448#endif 449 450 /* step 2: fill the buffer */ 451 452 s = PyString_AsString(string); 453 454 for (f = format; *f; f++) { 455 if (*f == '%') { 456 const char* p = f++; 457 /* parse the width.precision part (we're only 458 interested in the precision value, if any) */ 459 n = 0; 460 while (isdigit(Py_CHARMASK(*f))) 461 n = (n*10) + *f++ - '0'; 462 if (*f == '.') { 463 f++; 464 n = 0; 465 while (isdigit(Py_CHARMASK(*f))) 466 n = (n*10) + *f++ - '0'; 467 } 468 while (*f && *f != '%' && !isalpha(Py_CHARMASK(*f))) 469 f++; 470 switch (*f) { 471 case 'c': 472 *s++ = va_arg(vargs, int); 473 break; 474 case 'd': 475 sprintf(s, "%d", va_arg(vargs, int)); 476 s = s + strlen(s); 477 break; 478 case 'i': 479 sprintf(s, "%i", va_arg(vargs, int)); 480 s = s + strlen(s); 481 break; 482 case 'x': 483 sprintf(s, "%x", va_arg(vargs, int)); 484 s = s + strlen(s); 485 break; 486 case 's': 487 p = va_arg(vargs, char*); 488 i = strlen(p); 489 if (n > 0 && i > n) 490 i = n; 491 memcpy(s, p, i); 492 s = s + i; 493 break; 494 case '%': 495 *s++ = '%'; 496 break; 497 default: 498 strcpy(s, p); 499 s = s + strlen(s); 500 goto end; 501 } 502 } else 503 *s++ = *f; 504 } 505 506 end: 507 508 _PyString_Resize(&string, s - PyString_AsString(string)); 509 510 PyErr_SetObject(exception, string); 511 Py_XDECREF(string); 512 513 return NULL; 514} 515 516 517PyObject * 518PyErr_NewException(char *name, PyObject *base, PyObject *dict) 519{ 520 char *dot; 521 PyObject *modulename = NULL; 522 PyObject *classname = NULL; 523 PyObject *mydict = NULL; 524 PyObject *bases = NULL; 525 PyObject *result = NULL; 526 dot = strrchr(name, '.'); 527 if (dot == NULL) { 528 PyErr_SetString(PyExc_SystemError, 529 "PyErr_NewException: name must be module.class"); 530 return NULL; 531 } 532 if (base == NULL) 533 base = PyExc_Exception; 534 if (!PyClass_Check(base)) { 535 /* Must be using string-based standard exceptions (-X) */ 536 return PyString_FromString(name); 537 } 538 if (dict == NULL) { 539 dict = mydict = PyDict_New(); 540 if (dict == NULL) 541 goto failure; 542 } 543 if (PyDict_GetItemString(dict, "__module__") == NULL) { 544 modulename = PyString_FromStringAndSize(name, (int)(dot-name)); 545 if (modulename == NULL) 546 goto failure; 547 if (PyDict_SetItemString(dict, "__module__", modulename) != 0) 548 goto failure; 549 } 550 classname = PyString_FromString(dot+1); 551 if (classname == NULL) 552 goto failure; 553 bases = Py_BuildValue("(O)", base); 554 if (bases == NULL) 555 goto failure; 556 result = PyClass_New(bases, dict, classname); 557 failure: 558 Py_XDECREF(bases); 559 Py_XDECREF(mydict); 560 Py_XDECREF(classname); 561 Py_XDECREF(modulename); 562 return result; 563} 564 565/* Call when an exception has occurred but there is no way for Python 566 to handle it. Examples: exception in __del__ or during GC. */ 567void 568PyErr_WriteUnraisable(PyObject *obj) 569{ 570 PyObject *f, *t, *v, *tb; 571 PyErr_Fetch(&t, &v, &tb); 572 f = PySys_GetObject("stderr"); 573 if (f != NULL) { 574 PyFile_WriteString("Exception ", f); 575 if (t) { 576 PyFile_WriteObject(t, f, Py_PRINT_RAW); 577 if (v && v != Py_None) { 578 PyFile_WriteString(": ", f); 579 PyFile_WriteObject(v, f, 0); 580 } 581 } 582 PyFile_WriteString(" in ", f); 583 PyFile_WriteObject(obj, f, 0); 584 PyFile_WriteString(" ignored\n", f); 585 PyErr_Clear(); /* Just in case */ 586 } 587 Py_XDECREF(t); 588 Py_XDECREF(v); 589 Py_XDECREF(tb); 590} 591 592 593/* Function to issue a warning message; may raise an exception. */ 594int 595PyErr_Warn(PyObject *category, char *message) 596{ 597 PyObject *mod, *dict, *func = NULL; 598 599 mod = PyImport_ImportModule("warnings"); 600 if (mod != NULL) { 601 dict = PyModule_GetDict(mod); 602 func = PyDict_GetItemString(dict, "warn"); 603 Py_DECREF(mod); 604 } 605 if (func == NULL) { 606 PySys_WriteStderr("warning: %s\n", message); 607 return 0; 608 } 609 else { 610 PyObject *args, *res; 611 612 if (category == NULL) 613 category = PyExc_RuntimeWarning; 614 args = Py_BuildValue("(sO)", message, category); 615 if (args == NULL) 616 return -1; 617 res = PyEval_CallObject(func, args); 618 Py_DECREF(args); 619 if (res == NULL) 620 return -1; 621 Py_DECREF(res); 622 return 0; 623 } 624} 625 626 627/* Warning with explicit origin */ 628int 629PyErr_WarnExplicit(PyObject *category, char *message, 630 char *filename, int lineno, 631 char *module, PyObject *registry) 632{ 633 PyObject *mod, *dict, *func = NULL; 634 635 mod = PyImport_ImportModule("warnings"); 636 if (mod != NULL) { 637 dict = PyModule_GetDict(mod); 638 func = PyDict_GetItemString(dict, "warn_explicit"); 639 Py_DECREF(mod); 640 } 641 if (func == NULL) { 642 PySys_WriteStderr("warning: %s\n", message); 643 return 0; 644 } 645 else { 646 PyObject *args, *res; 647 648 if (category == NULL) 649 category = PyExc_RuntimeWarning; 650 if (registry == NULL) 651 registry = Py_None; 652 args = Py_BuildValue("(sOsizO)", message, category, 653 filename, lineno, module, registry); 654 if (args == NULL) 655 return -1; 656 res = PyEval_CallObject(func, args); 657 Py_DECREF(args); 658 if (res == NULL) 659 return -1; 660 Py_DECREF(res); 661 return 0; 662 } 663} 664 665 666/* XXX There's a comment missing here */ 667 668void 669PyErr_SyntaxLocation(char *filename, int lineno) 670{ 671 PyObject *exc, *v, *tb, *tmp; 672 673 /* add attributes for the line number and filename for the error */ 674 PyErr_Fetch(&exc, &v, &tb); 675 PyErr_NormalizeException(&exc, &v, &tb); 676 /* XXX check that it is, indeed, a syntax error */ 677 tmp = PyInt_FromLong(lineno); 678 if (tmp == NULL) 679 PyErr_Clear(); 680 else { 681 if (PyObject_SetAttrString(v, "lineno", tmp)) 682 PyErr_Clear(); 683 Py_DECREF(tmp); 684 } 685 if (filename != NULL) { 686 tmp = PyString_FromString(filename); 687 if (tmp == NULL) 688 PyErr_Clear(); 689 else { 690 if (PyObject_SetAttrString(v, "filename", tmp)) 691 PyErr_Clear(); 692 Py_DECREF(tmp); 693 } 694 695 tmp = PyErr_ProgramText(filename, lineno); 696 if (tmp) { 697 PyObject_SetAttrString(v, "text", tmp); 698 Py_DECREF(tmp); 699 } 700 } 701 PyErr_Restore(exc, v, tb); 702} 703 704/* com_fetch_program_text will attempt to load the line of text that 705 the exception refers to. If it fails, it will return NULL but will 706 not set an exception. 707 708 XXX The functionality of this function is quite similar to the 709 functionality in tb_displayline() in traceback.c. 710*/ 711 712PyObject * 713PyErr_ProgramText(char *filename, int lineno) 714{ 715 FILE *fp; 716 int i; 717 char linebuf[1000]; 718 719 if (filename == NULL || lineno <= 0) 720 return NULL; 721 fp = fopen(filename, "r"); 722 if (fp == NULL) 723 return NULL; 724 for (i = 0; i < lineno; i++) { 725 char *pLastChar = &linebuf[sizeof(linebuf) - 2]; 726 do { 727 *pLastChar = '\0'; 728 if (fgets(linebuf, sizeof linebuf, fp) == NULL) 729 break; 730 /* fgets read *something*; if it didn't get as 731 far as pLastChar, it must have found a newline 732 or hit the end of the file; if pLastChar is \n, 733 it obviously found a newline; else we haven't 734 yet seen a newline, so must continue */ 735 } while (*pLastChar != '\0' && *pLastChar != '\n'); 736 } 737 fclose(fp); 738 if (i == lineno) { 739 char *p = linebuf; 740 while (*p == ' ' || *p == '\t' || *p == '\014') 741 p++; 742 return PyString_FromString(p); 743 } 744 return NULL; 745} 746