Have you heard of people who have taken out insurance, only do discover that they're not covered for some eventuality - "but the list of circumstances doesn't include your flight being canceled because the plane couldn't fly through volcanic ash" is a story that many people heard, with an irony that no-one had even thought of that eventuality before it happened.
There has to be a better way. And in programming, there is!
We have long been encouraged - and I encourage delegates on courses - to check the external environment to their program. That's user inputs to make sure that when a number is asked for, they really have entered a number. It's checking the file system to make sure that a file they have asked to read really does exist. And it's checking that a network connection is alive if you're going to use a network resource. But such checks cannot allow for every eventuality, and something else is needed.
The "fail safe" way of mopping up all fluky errors (and a lot of the standard ones too) is to use an exception - where you write you code along the lines of "try to do X, and if it doesn't work for any reason, do Y to handle the problem. The syntax varies in different languages - in Python, we use the keyword
try to preface the code that we want to put in a safety net, and we use the keyword
except to specify the code that's to be run if the first block needs to be rescued.
From the Python course, just completed in Frankfurt - applying the net:
try:
said = raw_input(pr)
val = int(said)
And what to do when your user lands in the net and needs a rescue:
except:
print "Error - expected a whole number"
The complete source example - which includes a reprompt and further read from the user if an integer is not received -is
[here]. The same principle applies in other languages - in Ruby you have a
begin and a
rescue block. Source example
[here]
Note - even with exceptions there can be slightly more to it than just a single safety net. We've chosen in the complete example to reprompt the user which initially you might think is always a good thing to do. However, if the user's input was an end of file, there is
no point in trying to read any further - and to do so may even put our program into an infinite loop. So I've added a second
except block to my source, and it's first in the source so that it takes precedence - to specifically catch end-of-file conditions and handle them in a different way.
(written 2011-02-19, updated 2011-02-20)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Y109 - Python - Exceptions [381] Exceptions in Python - (2005-07-17)
[1042] Nested exceptions in Python - (2007-01-18)
[1236] Trying things in Python - (2007-06-18)
[2018] UnboundLocalError - Python Message - (2009-01-31)
[2281] Python - using exceptions to set a fallback - (2009-07-12)
[2368] Python - fresh examples of all the fundamentals - (2009-08-20)
[2408] Robust user input (exception handling) example in Python - (2009-09-17)
[2622] Handling unusual and error conditions - exceptions - (2010-02-03)
[2994] Python - some common questions answered in code examples - (2010-10-10)
[2998] Using an exception to initialise a static variable in a Python function / method - (2010-10-13)
[3433] Exceptions - a fail-safe way of trapping things that may go wrong - (2011-09-11)
[3441] Pressing ^C in a Python program. Also Progress Bar. - (2011-09-15)
[3664] Error checking in a Python program - making your program robust via exceptions - (2012-03-22)
[3913] How many times ... has this loco headed west through Tenby? - Python exceptions - (2012-11-05)
[3930] Reporting the full stack trace when you catch a Python exception - (2012-11-22)
[4029] Exception, Lambda, Generator, Slice, Dict - examples in one Python program - (2013-03-04)
[4161] Python varables - checking existance, and call by name or by value? - (2013-08-27)
[4444] Elements of an exception in Python - try, except, else, finally - (2015-02-28)
R111 - Ruby - Exceptions. [1875] What are exceptions - Python based answer - (2008-11-08)
[2615] String to number conversion with error trapping in Ruby - (2010-02-01)
[2620] Direct access to object variable (attributes) in Ruby - (2010-02-02)
[2621] Ruby collections and strings - some new examples - (2010-02-03)
[3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
[3435] Sorta sorting a hash, and what if an exception is NOT thrown - Ruby - (2011-09-12)
[4008] Reading and checking user inputs - first lessons - Ruby - (2013-02-17)
[4675] Exceptions in Ruby - throwing, catching and using - (2016-05-17)
Some other Articles
Beware - a=a+b and a+=b are different - PythonAge limits for Well House Consultants Open Source courses?Oops - I typed ci not vi, and have lost my file ...The cost of roadworks on the economy of our town - 1800 pounds per hour?Insurance against any errors - Volcanoes and PythonComparing German, Dutch and British RailwaysThe Rhine in winterSharing a single hotel internet connection without carrying extra hardwareWhat is the Melksham Chamber of Commerce? On consultations, car parking, and Melksham town centre