Difference between revisions of "CSC111 Exercises with Exceptions: try/except"
(Created page with " =Code in need of try/except statements= * The program below is not very robust. We can easily make it crash. * Observe each function and see how to make it fail, or see why it...") |
(→Solution) |
||
(13 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | --[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 09:05, 2 April 2014 (EDT) | ||
+ | ---- | ||
+ | __TOC__ | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <bluebox> | ||
+ | The exercises below deal with protecting Python code that might crash with '''try/except''' statements to make the program robust. | ||
+ | </bluebox> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
=Code in need of try/except statements= | =Code in need of try/except statements= | ||
+ | <br /> | ||
* The program below is not very robust. We can easily make it crash. | * The program below is not very robust. We can easily make it crash. | ||
* Observe each function and see how to make it fail, or see why it will fail the way it is called | * Observe each function and see how to make it fail, or see why it will fail the way it is called | ||
* Make the program crash. Register the '''XXXXError''' that is generated. For example, if the output of the crash looks like this: | * Make the program crash. Register the '''XXXXError''' that is generated. For example, if the output of the crash looks like this: | ||
− | <font color="red" | + | <tt><font color="red"> |
Traceback (most recent call last): | Traceback (most recent call last): | ||
File "/Users/thiebaut/Desktop/except0.py", line 29, in <module> | File "/Users/thiebaut/Desktop/except0.py", line 29, in <module> | ||
Line 14: | Line 29: | ||
sum = sum + L[i] | sum = sum + L[i] | ||
'''IndexError''': list index out of range | '''IndexError''': list index out of range | ||
− | </ | + | </font></tt> |
:what you are interested in is '''IndexError'''. This is the ''exception'' you want to guard your code against. | :what you are interested in is '''IndexError'''. This is the ''exception'' you want to guard your code against. | ||
Line 28: | Line 43: | ||
</pre></code> | </pre></code> | ||
* Verify that you have made your functions more robust to erroneous input/data. | * Verify that you have made your functions more robust to erroneous input/data. | ||
+ | <br /> | ||
==Code== | ==Code== | ||
+ | <br /> | ||
<br /> | <br /> | ||
<source lang="python"> | <source lang="python"> | ||
def example1(): | def example1(): | ||
− | x = | + | for i in range( 3 ): |
− | + | x = int( input( "enter a number: " ) ) | |
− | + | y = int( input( "enter another number: " ) ) | |
+ | print( x, '/', y, '=', x/y ) | ||
def example2( L ): | def example2( L ): | ||
print( "\n\nExample 2" ) | print( "\n\nExample 2" ) | ||
sum = 0 | sum = 0 | ||
+ | sumOfPairs = [] | ||
for i in range( len( L ) ): | for i in range( len( L ) ): | ||
− | + | sumOfPairs.append( L[i]+L[i+1] ) | |
− | print( " | + | print( "sumOfPairs = ", sumOfPairs ) |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | def printUpperFile( fileName ): | |
+ | file = open( fileName, "r" ) | ||
+ | for line in file: | ||
+ | print( line.upper() ) | ||
+ | file.close() | ||
def main(): | def main(): | ||
Line 60: | Line 78: | ||
example2( [ 10, 3, 5, 6, "NA", 3 ] ) | example2( [ 10, 3, 5, 6, "NA", 3 ] ) | ||
example3( [ 10, 3, 5, 6 ] ) | example3( [ 10, 3, 5, 6 ] ) | ||
+ | |||
+ | printUpperFile( "doesNotExistYest.txt" ) | ||
+ | printUpperFile( "./Dessssktop/misspelled.txt" ) | ||
+ | |||
+ | main() | ||
+ | |||
+ | </source> | ||
+ | <br /> | ||
+ | |||
+ | |||
+ | |||
+ | ==Solution== | ||
+ | <br /> | ||
+ | <source lang="python"> | ||
+ | def example1(): | ||
+ | while True: | ||
+ | try: | ||
+ | x = int( input( "enter a number: " ) ) | ||
+ | y = int( input( "enter another number: " ) ) | ||
+ | print( x, '/', y, '=', x/y ) | ||
+ | break | ||
+ | except ZeroDivisionError: | ||
+ | print( "Can't divide by 0!" ) | ||
+ | except ValueError: | ||
+ | print( "That doesn't look like a number!" ) | ||
+ | except: | ||
+ | print( "something unexpected happend!" ) | ||
+ | |||
+ | |||
+ | def example2( L ): | ||
+ | print( "\n\nExample 2" ) | ||
+ | print( "L = ", L ) | ||
+ | sum = 0 | ||
+ | sumOfPairs = [] | ||
+ | for i in range( len( L ) ): | ||
+ | try: | ||
+ | sumOfPairs.append( L[i]+L[i+1] ) | ||
+ | except IndexError: | ||
+ | continue | ||
+ | except TypeError: | ||
+ | continue | ||
+ | |||
+ | print( "sumOfPairs = ", sumOfPairs ) | ||
+ | |||
+ | def printUpperFile( fileName ): | ||
+ | try: | ||
+ | file = open( fileName, "r" ) | ||
+ | except FileNotFoundError: | ||
+ | print( "***Error*** File", fileName, "not found!" ) | ||
+ | return False | ||
+ | |||
+ | for line in file: | ||
+ | print( line.upper() ) | ||
+ | file.close() | ||
+ | return True | ||
+ | |||
+ | def main(): | ||
+ | example1() | ||
+ | |||
+ | L = [ 10, 3, 5, 6, 9, 3 ] | ||
+ | example2( L ) | ||
+ | |||
+ | L = [ 10, 3, "NA", 6, 9, 3 ] | ||
+ | example2( L ) | ||
+ | open( "doesNotExistYest.txt", "w" ).close() | ||
+ | |||
+ | printUpperFile( "doesNotExistYest.txt" ): | ||
+ | |||
+ | printUpperFile( "./Dessssktop/misspelled.txt" ) | ||
+ | |||
+ | |||
main() | main() | ||
+ | </source> | ||
− | |||
<br /> | <br /> | ||
<br /> | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | |||
[[Category:CSC111]][[Category:Exercises]][[Category:Python]] | [[Category:CSC111]][[Category:Exercises]][[Category:Python]] |
Latest revision as of 12:51, 4 April 2014
--D. Thiebaut (talk) 09:05, 2 April 2014 (EDT)
The exercises below deal with protecting Python code that might crash with try/except statements to make the program robust.
Code in need of try/except statements
- The program below is not very robust. We can easily make it crash.
- Observe each function and see how to make it fail, or see why it will fail the way it is called
- Make the program crash. Register the XXXXError that is generated. For example, if the output of the crash looks like this:
Traceback (most recent call last): File "/Users/thiebaut/Desktop/except0.py", line 29, in <module> main() File "/Users/thiebaut/Desktop/except0.py", line 27, in main example3( [ 10, 3, 5, 6 ] ) File "/Users/thiebaut/Desktop/except0.py", line 18, in example3 sum = sum + L[i] IndexError: list index out of range
- what you are interested in is IndexError. This is the exception you want to guard your code against.
try:
........
........
except IndexError:
.........
- Verify that you have made your functions more robust to erroneous input/data.
Code
def example1():
for i in range( 3 ):
x = int( input( "enter a number: " ) )
y = int( input( "enter another number: " ) )
print( x, '/', y, '=', x/y )
def example2( L ):
print( "\n\nExample 2" )
sum = 0
sumOfPairs = []
for i in range( len( L ) ):
sumOfPairs.append( L[i]+L[i+1] )
print( "sumOfPairs = ", sumOfPairs )
def printUpperFile( fileName ):
file = open( fileName, "r" )
for line in file:
print( line.upper() )
file.close()
def main():
example1()
L = [ 10, 3, 5, 6, 9, 3 ]
example2( L )
example2( [ 10, 3, 5, 6, "NA", 3 ] )
example3( [ 10, 3, 5, 6 ] )
printUpperFile( "doesNotExistYest.txt" )
printUpperFile( "./Dessssktop/misspelled.txt" )
main()
Solution
def example1():
while True:
try:
x = int( input( "enter a number: " ) )
y = int( input( "enter another number: " ) )
print( x, '/', y, '=', x/y )
break
except ZeroDivisionError:
print( "Can't divide by 0!" )
except ValueError:
print( "That doesn't look like a number!" )
except:
print( "something unexpected happend!" )
def example2( L ):
print( "\n\nExample 2" )
print( "L = ", L )
sum = 0
sumOfPairs = []
for i in range( len( L ) ):
try:
sumOfPairs.append( L[i]+L[i+1] )
except IndexError:
continue
except TypeError:
continue
print( "sumOfPairs = ", sumOfPairs )
def printUpperFile( fileName ):
try:
file = open( fileName, "r" )
except FileNotFoundError:
print( "***Error*** File", fileName, "not found!" )
return False
for line in file:
print( line.upper() )
file.close()
return True
def main():
example1()
L = [ 10, 3, 5, 6, 9, 3 ]
example2( L )
L = [ 10, 3, "NA", 6, 9, 3 ]
example2( L )
open( "doesNotExistYest.txt", "w" ).close()
printUpperFile( "doesNotExistYest.txt" ):
printUpperFile( "./Dessssktop/misspelled.txt" )
main()