http://purl.org/tcl/home/man/tcl8.4/TclCmd/error.htm
RS In C, errors are something you loathe and try to avoid. In Tcl, they're like "little friends" - helpful (explaining the problem), not messing up everything (as a Segmentation Fault/Bus Error/Divide by Zero would do). For instance,
set fp [open foo.bar]
leads to the error
couldn't open "foo.bar": no such file or directory
which tells it pretty well, and does not terminate the application (if it has an event loop or is interactive). In C, you would have received a NULL pointer, and without checking that, Segmentation Fault would be right around the corner. So in C, you have to add checks for everything that might go wrong; in Tcl, you only need to treat errors if you can express it better than Tcl already does.
And you can also play with errors: to fully break out of a multiply nested loop, put a catch outside and a throw within:
catch { ...# deep nesting ... throw }
There is no throw command in Tcl, so it is handled by unknown, which tries to load it from auto_index, and if that fails too, an error is raised - which in turn is caught by the catch. Pretty natural, no? And still somehow Zen buddhistic, if you deliberately use a non-existing command, and it does just the right thing...
In some cases, stack traces look better (one less layer) if you replace
error "Something went wrong"
with
return -code error "Something went wrong"
Tcl syntax help - Arts and crafts of Tcl-Tk programming - Category Command