There are times when a Tcl command can fail because of the data being passed in to it ... and when it fails, it can do so with a spectacular crash! For example, the
glob command which matches files to a pattern (Tcl's
ls or
dir if you like to think of it that way) can go 'belly up' if there are no files at all that match the pattern:
no files matched glob pattern "*.lua"
while executing
"glob *.lua"
invoked from within
"set file [glob *.lua]"
(file "tcl/falls" line 15)
OOooops!
If you want your Tcl program to continue, even on an error, you should use the
catch command and run the command that may fail within a deferred block that's passed in to it ... something like:
catch {glob *.lua} yikes
.
It works like this:
• If the command WORKS, the result is put back into the
yikes variable, and
catch returns a true value,
but
• if the command FAILS, an
error message is put into the
yikes variable, and
catch returns a false value.
There's a code example
here that illustrates catching (on glob) with testihng the conditionals. And further examples
here (failing) and
here (caught). There's also a further explanation on the blog
here, and a demonstration of how catch can handle a failure to open a file
here.
When you are first writing a piece of code - writing what's known as a 'proof of concept' or a 'spike solution', you may not be thinking about error handling too much. But it reallity such code testing / defensive coding against errors is VITAL. So we make certain that we cover
catch and loads of associated subjects on our
Tcl Programming courses.
(written 2009-10-22)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
T214 - Tcl/Tk - Other Facilities in Tcl [239] What and why for the epoch - (2005-03-08)
[364] pu daily and p hourly - (2005-06-30)
[366] Error handling in Tcl through catch - (2005-07-02)
[461] Shortened interactive commands - (2005-10-11)
[748] Getting rid of variables after you have finished with them - (2006-06-06)
[782] Converting between Hex and Decimal in Tcl - (2006-06-28)
[1277] AgtInvoke - a command to drive Agilent Tcl software extensions - (2007-07-26)
[1334] Stable sorting - Tcl, Perl and others - (2007-09-06)
[1338] Handling Binary data in Tcl (with a note on C) - (2007-09-09)
[3287] Exceptions - Tcl style - (2011-05-12)
[3570] Trapping errors in Tcl - the safety net that catch provides - (2012-01-06)
[3583] Expanding a list of parameters in Tcl - {*} and eval - (2012-01-17)
[4207] Exception handling in Tcl - (2013-11-14)
[4523] Catching failed commands and not crashing the program in Tcl - (2015-10-10)
[4525] What does Tcl do if you try to run a command that is not defined? - (2015-10-10)
[4762] Coverage map in Tcl - how many times has each proc been called? - (2017-09-28)
T209 - Tcl/Tk - File and Directory Handling [779] The fragility of pancakes - and better structures - (2006-06-26)
[785] Running external processes in Tcl and Tcl/Tk - (2006-06-29)
[1407] Reading from another process in Tcl (pipes and sockets) - (2007-10-26)
[1426] Buffering up in Tcl - the empty coke can comparison - (2007-11-10)
[1467] stdout v stderr (Tcl, Perl, Shell) - (2007-12-10)
[3192] Tcl - Some example of HOW TO in handling data files and formats - (2011-03-04)
[3320] Reading the nth line from a file (Perl and Tcl examples) - (2011-06-09)
[3429] Searching through all the files in or below a directory - Ruby, Tcl, Perl - (2011-09-09)
[3617] The fileutil package and a list of file system commands in Tcl - (2012-02-18)
[4461] Reading from a URL, and reading Json, from your Tcl script - (2015-03-12)
[4524] Tcl - a new example for data reformatting - (2015-10-10)
Some other Articles
A short form of if ... then ... elseWindows 7 and Open Source ProgrammingBeyond the PaleWhat are Tcl lists?Tcl - catching an error before your program crashesTcl - passing arrays and strings in and back out of procsMelksham Town - asleep or awake?Beauty in picturesTcl - a true interpretive, command based languagePython - how it saves on compile time