Every programmer encounters errors, both those who are just beginning, and those who have been programming for years. Encountering errors and exceptions can be very frustrating at times, and can make coding feel like a hopeless endeavour. However, understanding what the different types of errors are and when you are likely to encounter them can help a lot. Once you know why you get certain types of errors, they become much easier to fix.
Errors in Python have a very specific form, called a traceback. Let’s examine one:
import errors_01 errors_01.favorite_ice_cream()
This particular traceback has two levels. You can determine the number of levels by looking for the number of arrows on the left hand side. In this case:
The first shows code from the cell above, with an arrow pointing to Line 2 (which is
The second shows some code in another function (
favorite_ice_cream, located in the file
errors_01.py), with an arrow pointing to Line 7 (which is
The last level is the actual place where the error occurred. The other level(s) show what function the program executed to get to the next level down. So, in this case, the program first performed a function call to the function
favorite_ice_cream. Inside this function, the program encountered an error on Line 7, when it tried to run the code
So what error did the program actually encounter? In the last line of the traceback, Python helpfully tells us the category or type of error (in this case, it is an
IndexError) and a more detailed error message (in this case, it says “list index out of range”).
If you encounter an error and don’t know what it means, it is still important to read the traceback closely. That way, if you fix the error, but encounter a new one, you can tell that the error changed. Additionally, sometimes just knowing where the error occurred is enough to fix it, even if you don’t entirely understand the message.
If you do encounter an error you don’t recognize, try looking at the official documentation on errors. However, note that you may not always be able to find the error there, as it is possible to create custom errors. In that case, hopefully the custom error message is informative enough to help you figure out what went wrong.
When you forget a colon at the end of a line, accidentally add one space too many when indenting under an
if statement, or forget a parentheses, you will encounter a syntax error. This means that Python couldn’t figure out how to read your program. This is similar to forgetting punctuation in English:
this text is difficult to read there is no punctuation there is also no capitalization why is this hard because you have to figure out where each sentence ends you also have to figure out where each sentence begins to some extent it might be ambiguous if there should be a sentence break or not
People can typically figure out what is meant by text with no punctuation, but people are much smarter than computers. If Python doesn’t know how to read the program, it will just give up and inform you with an error. For example:
def some_function() msg = "hello, world!" print(msg) return msg
Here, Python tells us that there is a
SyntaxError on line 1, and even puts a little arrow in the place where there is an issue. In this case the problem is that the function definition is missing a colon at the end.
Actually, the function above has two issues with syntax. If we fix the problem with the colon, we see that there is also an
IndentationError, which means that the lines in the function definition do not all have the same indentation:
def some_function(): msg = "hello, world!" print(msg) return msg
IndentationError indicate a problem with the syntax of your program, but an
IndentationError is more specific: it always means that there is a problem with how your code is indented.
Another very common type of error is called a NameError, and occurs when you try to use a variable that does not exist. For example:
Variable name errors come with some of the most informative error messages, which are usually of the form “name ‘the_variable_name’ is not defined”.
Why does this error message occur? That’s harder question to answer, because it depends on what your code is supposed to do. However, there are a few very common reasons why you might have an undefined variable. The first is that you meant to use a string, but forgot to put quotes around it:
The second is that you just forgot to create the variable before using it. In the following example,
count should have been defined (e.g., with
count = 0) before the for loop:
for number in range(10): count = count + number print("The count is: " + str(count))
Finally, the third possibility is that you made a typo when you were writing your code. Let’s say we fixed the error above by adding the line
Count = 0 before the for loop. Frustratingly, this actually does not fix the error. Remember that variables are case-sensitive, so the variable
count is different from
Count. We still get the same error, because we still have not defined
Count = 0 for number in range(10): count = count + number print("The count is: " + str(count))
Next up are errors having to do with containers (like lists and dictionaries) and the items within them. If you try to access an item in a list or a dictionary that does not exist, then you will get an error. This makes sense: if you asked someone what day they would like to get coffee, and they answered “caturday”, you might be a bit annoyed. Python gets similarly annoyed if you try to ask it for an item that doesn’t exist:
letters = ['a', 'b', 'c'] print("Letter #1 is " + letters) print("Letter #2 is " + letters) print("Letter #3 is " + letters) print("Letter #4 is " + letters)
Here, Python is telling us that there is an
IndexError in our code, meaning we tried to access a list index that did not exist.
The last type of error we’ll cover today are those associated with reading and writing files:
FileNotFoundError. If you try to read a file that does not exist, you will recieve a
FileNotFoundError telling you so.
file_handle = open('myfile.txt', 'r')
One reason for receiving this error is that you specified an incorrect path to the file. For example, if I am currently in a folder called
myproject, and I have a file in
myproject/writing/myfile.txt, but I try to just open
myfile.txt, this will fail. The correct path would be
writing/myfile.txt. It is also possible (like with
NameError) that you just made a typo.
Another issue could be that you used the "read" flag instead of the "write" flag. Python will not give you an error if you try to open a file for writing when the file does not exist. However, if you meant to open a file for reading, but accidentally opened it for writing, and then try to read from it, you will get an
IOError error telling you that the file was not opened for reading:
file_handle = open('myfile.txt', 'w') file_handle.read()
These are the most common errors with files, though many others exist. If you get an error that you’ve never seen before, searching the Internet for that error type often reveals common reasons why you might get that error.
Run the code below and read the traceback. Identify the following pieces of information about it:
import errors_02 errors_02.print_friday_message()
#1. 3 #2. ~/workshop_sunpy_astropy/errors_02.py #3. print_message() #4. 11 #5. KeyError #6. 'Friday'
def another_function print("Syntax errors are annoying.") print("But at least python tells us about them!") print("So they are usually not too hard to fix.")
# def another_function - SyntaxError # print("But at least...") - IndentationError
NameErrordo you think this is? In other words, is it a string with no quotes, a misspelled variable, or a variable that should have been defined but was not?
for number in range(10): # use a if the number is a multiple of 3, otherwise use b if (Number % 3) == 0: message = message + a else: message = message + "b" print(message)
#1. # if (Number % 3) == 0: - NameError # message = message + a - NameError (twice) #2. # misspelled variable # variable not defined # string with no quotes
seasons = ['Spring', 'Summer', 'Fall', 'Winter'] print('My favorite season is ', seasons)
#1. # seasons - IndexError