Error checking of inputs, in some way, is vital. You may use conditionals such as if
, you may precheck
data before it reaches your program, or you may do both. But can you be sure you'll meet every eventuality? It's a difficult game forecasting everything that might go wrong. By using excpetions
, you can throw a safety net under operations that may potentially fail, catch the failing in the net, and take remedial action.
On our Python courses, we set an exercise during which we ask delegates to "Graham-proof" this piece of code - in other words, modify it so that no matter what I do to the running program, planned, known and reasonable actions will follow.
first = int(input("First number: "))
second = int(input("Second number: "))
print "Sum is "+str(first+second)
And yesterday I wrote a complete sample answer which you can see [here]
The first thing to remember is "if you find yourself repeating code, there must be an easier way"
- so rather than sanitise both input lines separately, you should use a function (the alternative of a loop was considered and discarded, since the code could be useful elsewhere in different contexts and programs.
). So the equivalent of the three lines above becomes:
first = getval("First number:")
second = getval("Second number:")
print "Sum is "+str(first+second)
My new getval
routine reads an input just like the original, but does so within a try
block, where I can catch and act on system generated errors - and I've chosen to do so in the following order:
- Catch End-of-file errors first as they need a special action - there's little point in trying to read again when there's no data available
- Catch all other errors, describing the problem to the user and asking him / her to try again
- Catching user generated "break" request (Ctrl-C) and handling them neatly - we decided to make it necessary to press ^C twice to make sure before the program truely exits.
And in with all this work is the need to make a careful decision as to how detailed the information provided to the use who's made an incorrect entry will be. Too little information, and the user's told "you got that wrong" without advice as to how to correct the problem. But too much information, especially the prining of internal error messages and report, and you'll end up with a frightened and confused user. In the sample answer, I've printed out quite a bit of that data as an illustration to the user - who will be a trainee programmer - of the issues that may occur and the data that's available; a classic example of considering the type of customer when you're writing a user interface, and perhaps an extreme solution.
One final note - will your program be run as a stand alone script, or called up from within another script / batch file / make file? You may not know, so it's a good idea as part of your code sanitising exercise to return a success or failure flag to the insticating command prompt / shell / process. At this level of programming, a return status of 0 indicates correct completion, with a value of 1 or higher indicating a failure. And in Python, we use the exit
function (formerly sys.exit()
) to conclude our operation and report back as appropriate.
(written 2012-03-22, updated 2012-03-24)
Associated topics are indexed underY109 - Python - Exceptions 
Exception, Lambda, Generator, Slice, Dict - examples in one Python program - (2013-03-04) 
Reporting the full stack trace when you catch a Python exception - (2012-11-22) 
How many times ... has this loco headed west through Tenby? - Python exceptions - (2012-11-05) 
Pressing ^C in a Python program. Also Progress Bar. - (2011-09-15) 
Exceptions - a fail-safe way of trapping things that may go wrong - (2011-09-11) 
Insurance against any errors - Volcanoes and Python - (2011-02-19) 
Using an exception to initialise a static variable in a Python function / method - (2010-10-13) 
Python - some common questions answered in code examples - (2010-10-10) 
Handling unusual and error conditions - exceptions - (2010-02-03) 
Robust user input (exception handling) example in Python - (2009-09-17) 
Python - fresh examples of all the fundamentals - (2009-08-20) 
Python - using exceptions to set a fallback - (2009-07-12) 
UnboundLocalError - Python Message - (2009-01-31) 
Trying things in Python - (2007-06-18) 
Nested exceptions in Python - (2007-01-18) 
Exceptions in Python - (2005-07-17)
Some other Articles
Kings Cross - new concourse - between Python in Cambridge and Objective C in LondonA modern area of Cambridge - some thoughts provoked?Makefile variables - defined internally, from the command line and from the environmentWill will smile?Error checking in a Python program - making your program robust via exceptionsChanging shops and organisations - Melksham, the last and next five yearsFinding all the unique lines in a file, using Python or PerlKeeping forum and blog comments cleanA Pivotal Incident - learning how to welcome your guestsWelcome to Melksham - our new communities