Exceptions and traceback

Exceptions and traceback#

  • As a user: don’t panic, read

  • Block try with keywords except and finally

  • Keyword raise

Exceptions and try, except syntax#

Exceptions and errors are common in all codes. There is a good system to handle them in Python. Let’s first see the following code, which gives an error despite being syntactically correct:

letters = "abc"
i = 3
print(letters[i])

When these lines are executed, Python stops its execution and print a traceback:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-30-8df9cec1a0ec> in <module>()
      1 letters = "abc"
      2 i = 3
----> 3 print(letters[i])

IndexError: string index out of range

Handling exception:

letters = "abc"
i = 3
try:
    print(letters[i])
except IndexError as e:
    print(f"An IndexError has been raised and caught (message: '{e}')")
An IndexError has been raised and caught (message: 'string index out of range')

Warning

Never use

except:

It means “except all errors and exceptions”. A user Control-C is an exception (KeyboardInterrupt) so it would be caught and have no effect.

We computed the average value of a list of numbers in a previous exercise. The following code seems innocuous

numbers = [1, 2]
avg0 = sum(numbers) / len(numbers)

Except in the edge case when you apply it to an empty list. try and except is a good way to avoid errors in your code

numbers = []
try:
    avg0 = sum(numbers) / len(numbers)
except ZeroDivisionError:
    print("Cannot compute average of empty list")
Cannot compute average of empty list

Full syntax#

try:
    ...
except <exception1> as e1:
    ...
except <exception2> as e2:
    ...
else:
    ...
finally:
    ...

Non exhaustive error list:

  • ArithmeticError

  • ZeroDivisionError

  • IndexError

  • KeyError

  • AttributeError

  • IOError

  • ImportError

  • NameError

  • SyntaxError

  • TypeError

Exercise 10

Place each element of this string in a list while trying to convert elements to floats (i.e. “hello” should raise an error that it cannot be represented as a float, 2 and 1.5 should become floats). Do it by catching errors.

str_variables = "hello 1.5 2"

the_list_you_should_get = ["hello", 1.5, 2.0]

Hints:

  • float("a") raise ValueError,

  • the str str_variable should be split.