5.2 Exception Handling
107
import numpy as np
def ask_user(a, b):
"""get answer from user: a*b = ?"""
question = ’{:d} * {:d} = ’.format(a, b)
answer = int(input(question))
return answer
def points(a, b, answer_given):
"""Check answer. Correct: 1 point, else 0"""
true_answer = a*b
if answer_given == true_answer:
print(’Correct!’)
return 1
else:
print(’Sorry! Correct answer was: {:d}’.format(true_answer))
return 0
print(’\n*** Welcome to the times tables test! ***\
\n
(To stop: ctrl-c)’)
N = 10
NN = N*N
score = 0
index = list(range(0, NN, 1))
np.random.shuffle(index)
# randomize order of integers in index
for i in range(0, NN, 1):
a = index[i]//N + 1
b = index[i]%N + 1
try:
user_answer = ask_user(a, b)
except:
print(’You must give a valid number!’)
continue
# jump to next loop iteration
score = score + points(a, b, user_answer)
print(’Your score is now: {:d}’.format(score))
print(’\nFinished! \nYour final score: {:d}
(max: {:d})’\
.format(score, N*N))
What will happen here? During execution, Python will first try to execute
user_answer = ask_user(a, b) in the try block. If it executes without
trouble, the except block is skipped, and execution continues with the line
score = score + points(a, b, user_answer). However, if an exception
is raised, execution proceeds immediately with print and continue in the except
block. If so, the assignment to user_answer does not take place. The continue
statement makes us move to the next question, since it immediately brings execution
to the next loop iteration, i.e., score is neither updated, nor printed, before “leaving”
that iteration.
This solution is a step forward for our program, since we avoid an unintentional
stop if someone accidentally hits the wrong key. However, the except block here will
handle all kinds of exceptions, and, in particular, trying to stop the program with
Ctrl-c will no longer work (in stead, you may choose Consoles and Restart
kernel from the Spyder menu)! It would be better programming to differentiate
Précédent

- 128/350

Suivant