[Python-Dev] SyntaxError for illegal literals

M.-A. Lemburg mal@lemburg.com
Wed, 14 Feb 2001 13:00:42 +0100


Ka-Ping Yee wrote:
> 
> I wrote:
> > The strongest reason is that a long file with a typo in a string
> > literal somewhere in hundreds of lines of code generates only
> >
> >     ValueError: invalid \x escape
> >
> > with no indication to where the error is -- not even which file!
> 
> Thomas Wouters wrote:
> > This has nothing to do with the error being a ValueError, but with some
> > (compile-time) errors not being promoted to 'full' errors. See
> 
> I think they are entirely related.  All ValueErrors should be run-time
> errors; a ValueError should never occur during compilation.  The key
> issue is communicating clearly with the user, and that's just not what
> ValueError *means*.
> 
> M.-A. Lemburg wrote:
> > Right and I think this touches the core of the problem. SyntaxErrors
> > produce a proper traceback while ValueErrors (and others) just print
> > a single line which doesn't even have the filename or line number.
> 
> This follows sensibly from the fact that SyntaxErrors are always
> compile-time errors (and therefore have no traceback or frame at the
> level where the error occurred).  ValueErrors are usually run-time
> errors, so .filename and .lineno attributes would be redundant;
> this information is already available in the associated frame object.

Those attributes are added to the error object by set_error_location()
in compile.c. Since the error objects are Python instances, the
function will set those attribute on any error which the
compiler raises and IMHO, this would be a good thing.
 
> > Perhaps lifting the restriction in PyErr_PrintEx() and making the
> > parse_syntax_error() API a little more robust might do the trick.
> > Then the various direct PyErr_SetString() calls in compile.c
> > should be converted to use com_error() instead (if possible).
> 
> That sounds like a significant amount of work, and i'm not sure it's
> the right answer. 

Changing all compile time errors to SyntaxError requires much the
same amount of work... you'd have to either modify the code to
use com_error() or check for errors and then redirect them
to com_error() (e.g. for codec errors).

> If we just clarify the boundary by making sure
> make sure that all, and only, compile-time errors are SyntaxErrors,
> everything would work properly and the meaning of the various
> exception classes would be clearer.  The only exceptions that don't
> currently conform, as far as i know, have to do with invalid literals.

Well, there are also system and memory errors and the codecs are free 
to raise any other kind of error as well.

-- 
Marc-Andre Lemburg
______________________________________________________________________
Company:                                        http://www.egenix.com/
Consulting:                                    http://www.lemburg.com/
Python Pages:                           http://www.lemburg.com/python/