diff options
author | Fred Drake <fdrake@acm.org> | 2000-10-24 19:57:45 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2000-10-24 19:57:45 (GMT) |
commit | 661ea26b3d8621ad0acc0ed2f2036ab29355f8ff (patch) | |
tree | fcfe10c4656a3e18911cd3b41b7d8c942d707786 /Python | |
parent | bd6f4fba1bc66a18cc15d50ffdd33faedff5ac4c (diff) | |
download | cpython-661ea26b3d8621ad0acc0ed2f2036ab29355f8ff.zip cpython-661ea26b3d8621ad0acc0ed2f2036ab29355f8ff.tar.gz cpython-661ea26b3d8621ad0acc0ed2f2036ab29355f8ff.tar.bz2 |
Ka-Ping Yee <ping@lfw.org>:
Changes to error messages to increase consistency & clarity.
This (mostly) closes SourceForge patch #101839.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 52 | ||||
-rw-r--r-- | Python/ceval.c | 77 | ||||
-rw-r--r-- | Python/errors.c | 2 | ||||
-rw-r--r-- | Python/exceptions.c | 2 |
4 files changed, 76 insertions, 57 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 4ca1310..7c8cf18 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -71,7 +71,7 @@ builtin_apply(PyObject *self, PyObject *args) if (!PyTuple_Check(alist)) { if (!PySequence_Check(alist)) { PyErr_SetString(PyExc_TypeError, - "apply() 2nd argument must be a sequence"); + "apply() arg 2 must be a sequence"); return NULL; } t = PySequence_Tuple(alist); @@ -82,7 +82,7 @@ builtin_apply(PyObject *self, PyObject *args) } if (kwdict != NULL && !PyDict_Check(kwdict)) { PyErr_SetString(PyExc_TypeError, - "apply() 3rd argument must be dictionary"); + "apply() arg 3 must be a dictionary"); goto finally; } retval = PyEval_CallObjectWithKeywords(func, alist, kwdict); @@ -181,7 +181,7 @@ builtin_filter(PyObject *self, PyObject *args) sqf = seq->ob_type->tp_as_sequence; if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) { PyErr_SetString(PyExc_TypeError, - "argument 2 to filter() must be a sequence type"); + "filter() arg 2 must be a sequence"); goto Fail_2; } @@ -368,7 +368,7 @@ builtin_compile(PyObject *self, PyObject *args) start = Py_single_input; else { PyErr_SetString(PyExc_ValueError, - "compile() mode must be 'exec' or 'eval' or 'single'"); + "compile() arg 3 must be 'exec' or 'eval' or 'single'"); return NULL; } return Py_CompileString(str, filename, start); @@ -421,7 +421,7 @@ complex_from_string(PyObject *v) } else if (PyObject_AsCharBuffer(v, &s, &len)) { PyErr_SetString(PyExc_TypeError, - "complex() needs a string first argument"); + "complex() arg is not a string"); return NULL; } @@ -431,7 +431,7 @@ complex_from_string(PyObject *v) s++; if (s[0] == '\0') { PyErr_SetString(PyExc_ValueError, - "empty string for complex()"); + "complex() arg is an empty string"); return NULL; } @@ -445,7 +445,7 @@ complex_from_string(PyObject *v) if (s-start != len) { PyErr_SetString( PyExc_ValueError, - "null byte in argument for complex()"); + "complex() arg contains a null byte"); return NULL; } if(!done) sw_error=1; @@ -531,7 +531,7 @@ complex_from_string(PyObject *v) if (sw_error) { PyErr_SetString(PyExc_ValueError, - "malformed string for complex()"); + "complex() arg is a malformed string"); return NULL; } @@ -557,7 +557,7 @@ builtin_complex(PyObject *self, PyObject *args) ((nbi = i->ob_type->tp_as_number) == NULL || nbi->nb_float == NULL))) { PyErr_SetString(PyExc_TypeError, - "complex() argument can't be converted to complex"); + "complex() arg can't be converted to complex"); return NULL; } /* XXX Hack to support classes with __complex__ method */ @@ -748,7 +748,7 @@ builtin_eval(PyObject *self, PyObject *args) if (!PyString_Check(cmd) && !PyUnicode_Check(cmd)) { PyErr_SetString(PyExc_TypeError, - "eval() argument 1 must be string or code object"); + "eval() arg 1 must be a string or code object"); return NULL; } if (PyString_AsStringAndSize(cmd, &str, NULL)) @@ -1224,7 +1224,7 @@ builtin_int(PyObject *self, PyObject *args) base); else { PyErr_SetString(PyExc_TypeError, - "can't convert non-string with explicit base"); + "int() can't convert non-string with explicit base"); return NULL; } } @@ -1257,7 +1257,7 @@ builtin_long(PyObject *self, PyObject *args) base); else { PyErr_SetString(PyExc_TypeError, - "can't convert non-string with explicit base"); + "long() can't convert non-string with explicit base"); return NULL; } } @@ -1384,7 +1384,7 @@ min_max(PyObject *args, int sign) sq = v->ob_type->tp_as_sequence; if (sq == NULL || sq->sq_item == NULL) { PyErr_SetString(PyExc_TypeError, - "min() or max() of non-sequence"); + "min() or max() arg must be a sequence"); return NULL; } w = NULL; @@ -1417,7 +1417,7 @@ min_max(PyObject *args, int sign) } if (w == NULL) PyErr_SetString(PyExc_ValueError, - "min() or max() of empty sequence"); + "min() or max() arg is an empty sequence"); return w; } @@ -1520,7 +1520,7 @@ builtin_ord(PyObject *self, PyObject *args) ord = (long)*PyUnicode_AS_UNICODE(obj); } else { PyErr_Format(PyExc_TypeError, - "expected string or Unicode character, " \ + "ord() expected string or Unicode character, " \ "%.200s found", obj->ob_type->tp_name); return NULL; } @@ -1528,7 +1528,7 @@ builtin_ord(PyObject *self, PyObject *args) return PyInt_FromLong(ord); PyErr_Format(PyExc_TypeError, - "expected a character, length-%d string found", + "ord() expected a character, length-%d string found", size); return NULL; } @@ -1607,7 +1607,7 @@ builtin_range(PyObject *self, PyObject *args) return NULL; } if (istep == 0) { - PyErr_SetString(PyExc_ValueError, "zero step for range()"); + PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero"); return NULL; } if (istep > 0) @@ -1617,7 +1617,7 @@ builtin_range(PyObject *self, PyObject *args) n = (int)bign; if (bign < 0 || (long)n != bign) { PyErr_SetString(PyExc_OverflowError, - "range() has too many items"); + "range() result has too many items"); return NULL; } v = PyList_New(n); @@ -1664,7 +1664,7 @@ builtin_xrange(PyObject *self, PyObject *args) return NULL; } if (istep == 0) { - PyErr_SetString(PyExc_ValueError, "zero step for xrange()"); + PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero"); return NULL; } if (istep > 0) @@ -1673,7 +1673,7 @@ builtin_xrange(PyObject *self, PyObject *args) n = get_len_of_range(ihigh, ilow, -istep); if (n < 0) { PyErr_SetString(PyExc_OverflowError, - "xrange() has more than sys.maxint items"); + "xrange() result has too many items"); return NULL; } return PyRange_New(ilow, n, istep, 1); @@ -1779,7 +1779,7 @@ builtin_reduce(PyObject *self, PyObject *args) sqf = seq->ob_type->tp_as_sequence; if (sqf == NULL || sqf->sq_item == NULL) { PyErr_SetString(PyExc_TypeError, - "2nd argument to reduce() must be a sequence object"); + "reduce() arg 2 must be a sequence"); return NULL; } @@ -1817,7 +1817,7 @@ builtin_reduce(PyObject *self, PyObject *args) if (result == NULL) PyErr_SetString(PyExc_TypeError, - "reduce of empty sequence with no initial value"); + "reduce() of empty sequence with no initial value"); return result; @@ -2073,7 +2073,7 @@ builtin_isinstance(PyObject *self, PyObject *args) if (icls != NULL) { retval = abstract_issubclass( icls, cls, - "second argument must be a class", + "isinstance() arg 2 must be a class", 1); Py_DECREF(icls); if (retval < 0) @@ -2081,13 +2081,13 @@ builtin_isinstance(PyObject *self, PyObject *args) } else { PyErr_SetString(PyExc_TypeError, - "second argument must be a class"); + "isinstance() arg 2 must be a class"); return NULL; } } else { PyErr_SetString(PyExc_TypeError, - "second argument must be a class"); + "isinstance() arg 2 must be a class"); return NULL; } return PyInt_FromLong(retval); @@ -2140,7 +2140,7 @@ builtin_zip(PyObject *self, PyObject *args) if (itemsize < 1) { PyErr_SetString(PyExc_TypeError, - "at least one sequence is required"); + "zip() requires at least one sequence"); return NULL; } /* args must be a tuple */ diff --git a/Python/ceval.c b/Python/ceval.c index a1c8190..df057b7 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -61,9 +61,9 @@ static void reset_exc_info(PyThreadState *); static void format_exc_check_arg(PyObject *, char *, PyObject *); #define NAME_ERROR_MSG \ - "There is no variable named '%s'" + "name '%.200s' is not defined" #define UNBOUNDLOCAL_ERROR_MSG \ - "Local variable '%.200s' referenced before assignment" + "local variable '%.200s' referenced before assignment" /* Dynamic execution profile */ #ifdef DYNAMIC_EXECUTION_PROFILE @@ -439,8 +439,10 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, if (argcount > co->co_argcount) { if (!(co->co_flags & CO_VARARGS)) { PyErr_Format(PyExc_TypeError, - "too many arguments; expected %d, got %d", - co->co_argcount, argcount); + "too many arguments to %s(); " + "expected %d, got %d", + PyString_AsString(co->co_name), + co->co_argcount, argcount); goto fail; } n = co->co_argcount; @@ -483,7 +485,9 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, if (j >= co->co_argcount) { if (kwdict == NULL) { PyErr_Format(PyExc_TypeError, - "unexpected keyword argument: %.400s", + "%.200s() got an unexpected " + "keyword argument '%.400s'", + PyString_AsString(co->co_name), PyString_AsString(keyword)); goto fail; } @@ -492,8 +496,10 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, else { if (GETLOCAL(j) != NULL) { PyErr_Format(PyExc_TypeError, - "keyword parameter redefined: %.400s", - PyString_AsString(keyword)); + "keyword parameter '%.400s' " + "redefined in call to %.200s()", + PyString_AsString(keyword), + PyString_AsString(co->co_name)); goto fail; } Py_INCREF(value); @@ -505,8 +511,10 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, for (i = argcount; i < m; i++) { if (GETLOCAL(i) == NULL) { PyErr_Format(PyExc_TypeError, - "not enough arguments; expected %d, got %d", - m, i); + "not enough arguments to " + "%.200s(); expected %d, got %d", + PyString_AsString(co->co_name), + m, i); goto fail; } } @@ -525,8 +533,9 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, } else { if (argcount > 0 || kwcount > 0) { - PyErr_SetString(PyExc_TypeError, - "no arguments expected"); + PyErr_Format(PyExc_TypeError, + "%.200s() expected no arguments", + PyString_AsString(co->co_name)); goto fail; } } @@ -565,7 +574,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, if (++tstate->recursion_depth > recursion_limit) { --tstate->recursion_depth; PyErr_SetString(PyExc_RuntimeError, - "Maximum recursion depth exceeded"); + "maximum recursion depth exceeded"); tstate->frame = f->f_back; Py_DECREF(f); return NULL; @@ -1825,7 +1834,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, /* Handy-dandy */ ; else { PyErr_SetString(PyExc_TypeError, - "unbound method must be called with class instance 1st argument"); + "unbound method must be called with instance as first argument"); x = NULL; break; } @@ -1908,9 +1917,10 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, PyObject *key = POP(); if (PyDict_GetItem(kwdict, key) != NULL) { err = 1; - PyErr_Format(PyExc_TypeError, - "keyword parameter redefined: %.400s", - PyString_AsString(key)); + PyErr_Format(PyExc_TypeError, + "keyword parameter '%.400s' " + "redefined in function call", + PyString_AsString(key)); Py_DECREF(key); Py_DECREF(value); goto extcall_fail; @@ -2308,7 +2318,7 @@ do_raise(PyObject *type, PyObject *value, PyObject *tb) } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, - "raise 3rd arg must be traceback or None"); + "raise: arg 3 must be a traceback or None"); goto raise_error; } @@ -2630,6 +2640,7 @@ static PyObject * call_builtin(PyObject *func, PyObject *arg, PyObject *kw) { if (PyCFunction_Check(func)) { + PyCFunctionObject* f = (PyCFunctionObject*) func; PyCFunction meth = PyCFunction_GetFunction(func); PyObject *self = PyCFunction_GetSelf(func); int flags = PyCFunction_GetFlags(func); @@ -2643,8 +2654,9 @@ call_builtin(PyObject *func, PyObject *arg, PyObject *kw) if (flags & METH_KEYWORDS) return (*(PyCFunctionWithKeywords)meth)(self, arg, kw); if (kw != NULL && PyDict_Size(kw) != 0) { - PyErr_SetString(PyExc_TypeError, - "this function takes no keyword arguments"); + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", + f->m_ml->ml_name); return NULL; } return (*meth)(self, arg); @@ -2653,11 +2665,13 @@ call_builtin(PyObject *func, PyObject *arg, PyObject *kw) return PyInstance_New(func, arg, kw); } if (PyInstance_Check(func)) { - PyObject *res, *call = PyObject_GetAttrString(func,"__call__"); + PyObject *res, *call = PyObject_GetAttrString(func, "__call__"); if (call == NULL) { + PyInstanceObject *inst = (PyInstanceObject*) func; PyErr_Clear(); - PyErr_SetString(PyExc_AttributeError, - "no __call__ method defined"); + PyErr_Format(PyExc_AttributeError, + "%.200s instance has no __call__ method", + PyString_AsString(inst->in_class->cl_name)); return NULL; } res = PyEval_CallObjectWithKeywords(call, arg, kw); @@ -2703,7 +2717,7 @@ call_function(PyObject *func, PyObject *arg, PyObject *kw) } if (self == NULL) { PyErr_SetString(PyExc_TypeError, - "unbound method must be called with class instance 1st argument"); + "unbound method must be called with instance as first argument"); return NULL; } Py_INCREF(arg); @@ -2849,7 +2863,7 @@ _PyEval_SliceIndex(PyObject *v, int *pi) } } else { PyErr_SetString(PyExc_TypeError, - "slice index must be int"); + "slice indices must be integers"); return 0; } /* Truncate -- very long indices are truncated anyway */ @@ -2935,7 +2949,7 @@ import_from(PyObject *v, PyObject *name) PyObject *w, *x; if (!PyModule_Check(v)) { PyErr_SetString(PyExc_TypeError, - "import-from requires module object"); + "import-from requires a module object"); return NULL; } w = PyModule_GetDict(v); /* TDB: can this not fail ? */ @@ -2958,7 +2972,7 @@ import_all_from(PyObject *locals, PyObject *v) if (!PyModule_Check(v)) { PyErr_SetString(PyExc_TypeError, - "import-from requires module object"); + "import-from requires a module object"); return -1; } w = PyModule_GetDict(v); /* TBD: can this not fail ? */ @@ -3068,12 +3082,17 @@ exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals, !PyCode_Check(prog) && !PyFile_Check(prog)) { PyErr_SetString(PyExc_TypeError, - "exec 1st arg must be string, code or file object"); + "exec: arg 1 must be a string, file, or code object"); + return -1; + } + if (!PyDict_Check(globals)) { + PyErr_SetString(PyExc_TypeError, + "exec: arg 2 must be a dictionary or None"); return -1; } - if (!PyDict_Check(globals) || !PyDict_Check(locals)) { + if (!PyDict_Check(locals)) { PyErr_SetString(PyExc_TypeError, - "exec 2nd/3rd args must be dict or None"); + "exec: arg 3 must be a dictionary or None"); return -1; } if (PyDict_GetItemString(globals, "__builtins__") == NULL) diff --git a/Python/errors.c b/Python/errors.c index 28dfbbe..3053e00 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -224,7 +224,7 @@ int PyErr_BadArgument(void) { PyErr_SetString(PyExc_TypeError, - "illegal argument type for built-in operation"); + "bad argument type for built-in operation"); return 0; } diff --git a/Python/exceptions.c b/Python/exceptions.c index 6d6291c..a95817c 100644 --- a/Python/exceptions.c +++ b/Python/exceptions.c @@ -188,7 +188,7 @@ get_self(PyObject *args) /* Watch out for being called to early in the bootstrapping process */ if (PyExc_TypeError) { PyErr_SetString(PyExc_TypeError, - "unbound method must be called with class instance 1st argument"); + "unbound method must be called with instance as first argument"); } return NULL; } |