[Python-Dev] SyntaxError for illegal literals

Guido van Rossum guido@digicool.com
Tue, 13 Feb 2001 18:32:15 -0500


> In support of the argument that bad literals should raise ValueError
> (or a derived exception) rather than SyntaxError, Guido once said:
> 
> > "Problems with literal interpretations
> > traditionally raise 'runtime' exceptions rather than syntax errors."
> 
> This is currently true of overflowing integers and string literals,
> and hence it has also been so implemented for Unicode literals.
> 
> But i want to propose a break with tradition, because some more recent
> thinking on this has led me to become firmly convinced that SyntaxError
> is really the right thing to do in all of these cases.
> 
> 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!
> I realize this could be hacked upon and fixed, but i think it points
> to a general inconsistency that ought to be considered and addressed.
> 
>     1.  SyntaxErrors are for compile-time errors.  A problem with
>         a literal happens before the program starts running, and
>         it is useful for me, as the programmer, to know whether
>         the error occurred because of some computational process,
>         possibly depending on inputs, or whether it's a permanent
>         mistake that's literally in my source code.  In other words,
>         will a debugger do me any good?
> 
>     2.  SyntaxErrors pinpoint the exact location of the problem.
>         In principle, an error is a SyntaxError if and only if you
>         can point to an exact character position as being the cause
>         of the problem.
> 
>     3.  A ValueError means "i got a value that wasn't allowed or
>         expected here".  That is not at all what is happening.
>         There is *no* defined value at all.  It's not that there
>         was a value and it was wrong -- the value was never even
>         brought into existence.
> 
>     4.  The current implementation of ValueErrors is very unhelpful
>         about what to do about an invalid literal, as explained
>         in the example above.  A SyntaxError would be much more useful.
> 
> I hope you will agree with me that solving only #4 by changing
> ValueErrors so they behave a little more like SyntaxErrors in
> certain particular situations isn't the best solution.
> 
> Also, switching to SyntaxError is likely to break very few things.
> You can't depend on catching a SyntaxError, precisely because it's
> a compile-time error.  No one could possibly be using "except ValueError"
> to try to catch invalid literals in their code; that usage, just like
> "except SyntaxError:", makes sense only when someone is using "eval" or
> "exec" to interpret code that was generated or read from input.
> 
> In fact, i bet switching to SyntaxError would actually make some code
> of the form "try: eval ... except SyntaxError" work better, since the
> single except clause would catch all possible compilation problems
> with the input to eval.

All good points, except that I still find it hard to flag overflow
errors as syntax errors, especially since overflow is platform
defined.

On one platform, 1000000000000 is fine; on another it's a
SyntaxError.  That could be confusing.

But you're absolutely right about string literals, and maybe it's OK
if 1000000000000000000000000000000000000000000000000000000000000000000
is flagged as a syntax error.  (After all it's missing a trailing
'L'.)

Another solution (borrowing from C): automatically promote int
literals to long if they can't be evaluated as ints.

--Guido van Rossum (home page: http://www.python.org/~guido/)