Non-Programmer's Tutorial for Python 3/Dealing with the imperfect
...or how to handle errors
closing files with with
with open("in_test.txt", "rt") as in_file: with open("out_test.txt", "wt") as out_file: text = in_file.read() data = parse(text) results = encode(data) out_file.write(results) print( "All done." )
If some sort of error happens anywhere in this code (one of the files is inaccessible, the parse() function chokes on corrupt data, etc.) the "with" statements guarantee that all the files will eventually be properly closed.
catching errors with try
So you now have the perfect program, it runs flawlessly, except for one detail, it will crash on invalid user input. Have no fear, for Python has a special control structure for you. It's called
try and it tries to do something. Here is an example of a program with a problem:
print("Type Control C or -1 to exit") number = 1 while number != -1: number = int(input("Enter a number: ")) print("You entered:", number)
Notice how when you enter
@#& it outputs something like:
Traceback (most recent call last): File "try_less.py", line 4, in <module> number = int(input("Enter a number: ")) ValueError: invalid literal for int() with base 10: '\\@#&'
As you can see the
int() function is unhappy with the number
@#& (as well it should be). The last line shows what the problem is; Python found a
ValueError. How can our program deal with this? What we do is first: put the place where errors may occur in a
try block, and second: tell Python how we want
ValueErrors handled. The following program does this:
print("Type Control C or -1 to exit") number = 1 while number != -1: try: number = int(input("Enter a number: ")) print("You entered:", number) except ValueError: print("That was not a number.")
Now when we run the new program and give it
@#& it tells us "That was not a number." and continues with what it was doing before.
When your program keeps having some error that you know how to handle, put code in a
try block, and put the way to handle the error in the
Update at least the phone numbers program (in section Dictionaries) so it doesn't crash if a user doesn't enter any data at the menu.
agenda = open("agendatelefonica.csv") for n in range(1,40): linea = agenda.readline() lineapartida = linea.split(",")
if lineapartida != "": mem = lineapartida print("El número máximo es: ", mem) agenda.close() memonum = int(mem)## aqui es donde me marca el error: "python valueerror invalid literal for int with base 10" posicion = 0 posicion = mem + 1 postr = str(posicion) print ("Se ha guardado en la agenda el contacto: ",nombre,"con el numero de telefono: ",telefono) agenda = open("agendatelefonica.csv",'a') agenda.write(postr) agenda.write(",") agenda.write(nombre) agenda.write(",") agenda.write(telefono) agenda.write(",") agenda.write("\n") agenda.close()