Exceptions Consider the following simple program We have to travel - - PowerPoint PPT Presentation

exceptions
SMART_READER_LITE
LIVE PREVIEW

Exceptions Consider the following simple program We have to travel - - PowerPoint PPT Presentation

Exceptions Consider the following simple program We have to travel 100 miles Ask the user for a speed to enter (in mph) Tell them the time, in hours, it will take to arrive denom = int(input("Enter a speed in mph: "))


slide-1
SLIDE 1

Exceptions

slide-2
SLIDE 2

Consider the following simple program…

 We have to travel 100 miles  Ask the user for a speed to enter (in mph)  Tell them the time, in hours, it will take to arrive

denom = int(input("Enter a speed in mph: ")) print(100/denom, “ hours to travel 100 miles.”)

slide-3
SLIDE 3

Consider the following simple program…

 We have to travel 100 miles  Ask the user for a speed to enter (in mph)  Tell them the time, in hours, it will take to arrive

denom = int(input("Enter a speed in mph: ")) print(100/denom, “ hours to travel 100 miles.”)

 This will crash if input is zero, though!

ZeroDivisionError: division by zero

slide-4
SLIDE 4

Error

 When Python crashes, it always gives an error:

 IndexError

 Accessing an index out of bounds in a list

 KeyError

 Acessing a dictionary key that doesn’t exist

 TypeError

 Performing an illegal interaction between types (“2” + 2)

 NameError

 Referencing a variable that hasn’t been created yet

 ValueError

 Function takes in a value it can’t use: int(“cat”), for example

 Typically, an error will crash the program…unless you catch it!

slide-5
SLIDE 5

Preventing the error

denom = 0 while denom <= 0: denom = int(input("Enter a speed in mph: ")) if (denom <= 0): print("Error: speed must be greater than zero! Try Again!") print(100/denom, " hours to travel 100 miles.")

 This won’t crash!

slide-6
SLIDE 6

But what if we can’t prompt the user?

 Imagine you are writing the back end of a system

 You are implementing the backend in Python, but you don’t have access to

the front end

 You can’t prompt the user

 You are writing a function that takes in two numbers:

 distance – the distance to be traveled in MPH  speed – the speed to travel in MPH

 At this point, having a ZeroDivisionError is the correct action if the speed

is zero

 Whoever is calling your function needs to call it correctly  Not your job to change the input!

slide-7
SLIDE 7

Why raise errors?

 "a common mistake that people make when trying to design

something completely foolproof is to underestimate the ingenuity of complete fools“ – Douglas Adams, Mostly Harmless

 If you are writing a function, you can’t change how people call the

function

 But you can force the person using your function to use it correctly  Raising and error informs a user they are using the function wrong  Avoids “easy to miss” garbage-in garbage-out

slide-8
SLIDE 8

Example

 The below is fine:  The end user shouldn’t be calling your function like this.  Are there any other ways the function travel_time shouldn’t be

called?

def travel_time(distance, speed): return distance / speed travel_time(5, 0) # throws a zero division error

slide-9
SLIDE 9

Travel_time errors

 What if the type is off?

 This looks absurd, but this compiles and runs (albeit crashing due to a

type error)

 What if distance or velocity is negative?

 This wouldn’t make sense, so can we prevent it?  As the function is written, it would return output, but is that output

useful?

travel_time("sheep", [2, 3, 5])

slide-10
SLIDE 10

Raising Errors

 You can raise errors!  This is called “defensive programming”

 Making sure your code can’t be called in an incorrect way

def travel_time(distance, speed): if (distance < 0): raise ValueError("travel_time distance cannot be negative") if (speed < 0): raise ValueError("travel_time speed cannot be negative") return distance / speed travel_time(-5, 10)

slide-11
SLIDE 11

What to do with Error

 If you call a function or perform an operation that could result in an

error, you can try to “catch” the error

 You can “catch” the error in order to handle it

 Format:

try: code that could throw an error except <KindOfError>: handling the exception

slide-12
SLIDE 12

Example

 What if when you get user input, the user enters invalid input?  Now, instead of crashing, we can catch the error, and just make the

user try again!

distance = 0; while distance == 0: try: distance = float(input("Enter a distance to travel in miles:")) except ValueError: print("You didn't enter a number. Please try again!")

slide-13
SLIDE 13

Error Tracing examples

 https://storage.googleapis.com/cs1111/examples/exception/exce

ption-tracing1.py

 There are actually 12, just change the last part of the url to:  exception-tracing[x].py

 Where x is a number 1-12