|
Error handling in Tcl through catch
Tcl is a truly interpretive language - and that means that you can get a syntax error if a user makes an illegal entry ... even in the middle of a program running. For example
puts -nonewline "please enter a number: "
flush stdout
gets stdin value
set doubled [expr $value * 2]
puts "Result is $doubled"
puts "application continues ..."
Will run correctly if you enter a number to the prompt as requested:
earth-wind-and-fire:~/jul05 grahamellis$ wish ifex
please enter a number: 17
Result is 34
application continues ...
earth-wind-and-fire:~/jul05 grahamellis$
but will fail if you enter something that isn't a number:
earth-wind-and-fire:~/jul05 grahamellis$ wish ifex
please enter a number: lots
Error in startup script: syntax error in expression "lots * 2": variable references require preceding $
while executing
"expr $value * 2"
invoked from within
"set doubled [expr $value * 2]"
(file "ifex" line 6)
earth-wind-and-fire:~/jul05 grahamellis$
If you want to make your Tcl code rugged against such errors, embed commands that may cause a problem within catch commands. Tcl's catch command returns a true of false result depending on whether or not the embedded command succeeds, and if it fails it also returns the error message describing the problem in a variable of your choice. Here's the program above, enhanced to catch any errors:
puts -nonewline "please enter a number: "
flush stdout
gets stdin value
if {[catch {set doubled [expr $value * 2]} errmsg]} {
puts "Failed - $errmsg"
} else {
puts "Succeeded and result is $doubled"
}
puts "application continues ..."
And let's try running that. Firstly, with correct data:
earth-wind-and-fire:~/jul05 grahamellis$ wish ifcat
please enter a number: 17
Succeeded and result is 34
application continues ...
earth-wind-and-fire:~/jul05 grahamellis$
And now with data that would previously have caused a crash:
earth-wind-and-fire:~/jul05 grahamellis$ wish ifcat
please enter a number: many
Failed - syntax error in expression "many * 2": variable references require preceding $
application continues ...
earth-wind-and-fire:~/jul05 grahamellis$
Complete source code example - [here].
This approach described here could be described as an expection handling system as it tries to perform an operation and traps if a failure occurs, rather than trying to predict the error ahead of time. An alternative (error handling) system could have been used, in which the code check the input text string to make sure that it's numeric before the expr command is run. We have a comparison of exceptions v errors in our solution centre. (written 2005-07-02, updated 2012-03-04)
5988
Associated topics are indexed under T214 - Tcl/Tk - Other Facilities in Tcl [3583] Expanding a list of parameters in Tcl - {*} and eval - (2012-01-17) [3570] Trapping errors in Tcl - the safety net that catch provides - (2012-01-06) [3287] Exceptions - Tcl style - (2011-05-12) [2467] Tcl - catching an error before your program crashes - (2009-10-22) [1338] Handling Binary data in Tcl (with a note on C) - (2007-09-09) [1334] Stable sorting - Tcl, Perl and others - (2007-09-06) [1277] AgtInvoke - a command to drive Agilent Tcl software extensions - (2007-07-26) [782] Converting between Hex and Decimal in Tcl - (2006-06-28) [748] Getting rid of variables after you have finished with them - (2006-06-06) [461] Shortened interactive commands - (2005-10-11) [364] pu daily and p hourly - (2005-06-30) [239] What and why for the epoch - (2005-03-08)
Some other Articles
From IcelandCMS - the minefield of ChoicesVacation WeekAjaxError handling in Tcl through catchLetterbox PicturesGreetings from EdinburghThe ireallyreallywanna operatorBinary Large Objects or bars
|
4090 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82 at 50 posts per page
This is a page archived from The Horse's Mouth at
http://www.wellho.net/horse/ -
the diary and writings of Graham Ellis.
Every attempt was made to provide current information at the time the
page was written, but things do move forward in our business - new software
releases, price changes, new techniques. Please check back via
our main site for current courses,
prices, versions, etc - any mention of a price in "The Horse's Mouth"
cannot be taken as an offer to supply at that price.
Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).
|
|