Error Messages are Good
=======================
Syntax and runtime errors *always* produce error messages. Understanding what
error messages mean is an important first step in fixing bugs.
**Error messages are your friends.** This idea might seem strange to new
programmers, because an error message signals that their program is broken.
When we are working with a broken program, we might feel frustrated, or think
that we do not fully understand the concepts.
However, the reality is that *all* programmers, no matter how experienced,
regularly make simple mistakes. If you run your program and it produces an
error message, your first reaction should be, "Great! My program has an error,
but I have a helpful message to help me fix it."
Let's consider a small program with a couple of syntax errors.
.. admonition:: Example
::
name = Julie
print("Hello, name)
While you might spot the errors just by looking at the code, let's examine the
error messages produced.
.. _syntax-error:
A Syntax Error
--------------
Running the program at this stage results in the message:
::
File "main.py", line 2
print("Hello, name)
^
SyntaxError: EOL while scanning string literal
While some error messages will contain a lot more text than this example, we
only need to really pay attention to a few lines.
#. The message will include the line number where the error was found. In this
case, line 2.
#. One or more ``^`` symbols will point to character(s) in that line.
::
print("Hello, name)
^
For many simple syntax errors, we will quickly spot the mistake once Python
points out its location to us.
#. If knowing the location of the error isn't enough, another line identifies
the type of error:
::
SyntaxError: EOL while scanning string literal
This line identifies that actual issue that Python found. It makes it clear
that we are dealing with a ``SyntaxError``, and it provides a message that
describes the issue.
If you are scratching your head at the message, "EOL while scanning string
literal," don't worry. Errors often use words and phrases that are not really
clear. However, noticing the words *string literal* and taking a second look at
the previous line helps us make sense of the message.
::
print("Hello, name)
^
Python is telling us that at the end of ``"Hello, name`` it encountered a
problem with the string. In this case, Python sees the double-quote character
and expects a string. However, we left off the closing ``"``, making the
code invalid.
Fixing this error gives us a program with correct syntax:
.. sourcecode:: Python
:linenos:
name = Julie
print("Hello", name)
.. admonition:: Note
Error messages may differ depending on where you run your code. The same
program run in a `repl.it `__ vs. a code editor on your
computer will generate slightly different error messages. However, these
differences are minor. The main cause of the error will be reported in the
same way.
Syntax Errors and Code Highlighting
-----------------------------------
.. index::
single: syntax; highlighting
Most code editors provide a feature known as **syntax highlighting**. This
means that the editors use different colors to highlight keywords, strings,
numbers, comments, etc. For example, keywords might be blue, strings might be
brown, variables might be white, and numbers green. This useful feature gives
us a quick, visual way to identify syntax errors.
For example, here is a screenshot of our flawed code taken within an
`editor at repl.it `__.
.. figure:: figures/syntax-highlighting.png
:alt: A screenshot with two lines of code. The highlighting is different than expected because of syntax errors.
Screenshot of a program with syntax errors.
Notice that the string ``Hello`` is colored brown, while the symbols ``=`` and
``(`` are colored black. In line 2, however, the comma and final ``)`` are both
brown rather than black. Since we haven't closed the string, the editor assumes
that these two symbols are *part of* the string. Since we expect ``, name)`` to
be black in this editor, the color difference gives us a clue that something is
wrong with our syntax.
Some editors also highlight syntax errors found in the code *before* we click
*Run*. Let's assume we tried to fix the syntax error by putting the closing
quote after ``"Hello,`` instead of ``"Hello``.
.. figure:: figures/red-underscore.png
:alt: A screenshot with two lines of code. On line 2, a red underscore
highlights where the editor found a syntax error.
A red underscore points to a syntax error.
The red wavy line underneath ``name)`` indicates that we still have a syntax
error in our code. Replacing ``("Hello," name)`` with ``("Hello", name)``
causes the red underscore to disappear.
A Runtime Error
---------------
Now that we fixed the syntax error, we can run our program again. Doing so
displays yet another error.
::
Traceback (most recent call last):
File "main.py", line 1, in
name = Julie
NameError: name 'Julie' is not defined
We have a new error message, this time involving line 1 of our code. We didn't
see this error before because it is a runtime error. The syntax error on line
2, stopped the program during the parsing phase. Even though the current error
involves the line *before* the syntax mistake, the syntax error still gets
reported first.
You might be able to see what the runtime error is, but let's inspect the
message anyway. Doing so will help us understand what Python errors tell us.
Once again, we are told where the error occurs:
::
name = Julie
There is no ``^`` symbol pointing to a mistake in the line, so let's look at
the next part of the message:
::
NameError: name 'Julie' is not defined
The type of error is ``NameError``. This occurs when we try to use a variable
that has not been defined earlier in the program.
This information, along with the rest of the message, "name 'Julie' is not
defined," tells us what Python is complaining about. The error message is
saying, *Hey, check your variables!*
In line 1, we forgot to put quotes around the string ``Julie``. *We* know
that we meant to assign the variable ``name`` a string value. However, Python
sees nothing in the program to indicate that ``Julie`` should be a string.
Without the quotes, Python treats ``Julie`` as a variable. Since there is no
such defined variable in our program, a ``NameError`` occurs.
Runtime Errors and Code Highlighting
------------------------------------
Besides syntax errors, code highlighting also helps us spot potential runtime
errors. However, these are harder to spot than syntax mistakes.
.. figure:: figures/highlight-runtime-error.png
:alt: A screenshot with two lines of code. On line 1, the black text color
indicates where we forgot to use quotes around a string.
Black text color indicates missing quotes around a string value.
The ``name`` variable should hold a string value, but the text color for
``Julie`` does not match the text color for ``"Hello"``. The color difference
might catch our eye and make us consider why.
Note that red underscores also point out some (but not all) runtime errors.
However, these will not show up until all of the syntax mistakes are fixed.
.. admonition:: Tip
Sometimes, hovering the pointer over the red underscore displays useful
information.
.. figure:: figures/hover-underscore.png
:alt: A screenshot with the pointer over a red underscore. Hovering over
the underscore displays a box with a short error message.
Try hovering over a red underscore.