Purpose: to discuss the issues of when and how to write exception handling code.
hv 2011-07-15: Here is a short snippet showing how to use the return command with -code error to throw an exception
proc double x { if {![string is integer $x]} { return -code error "double expects an int, not '$x'" } return [expr {$x * 2}] } set x 5 puts "x = $x" puts "2x = [double $x]" set x Hello puts "x = $x" if {[catch {puts "2x = [double $x]"} errmsg]} { puts "Error: $errmsg" }
Output:
x = 5 2x = 10 x = Hello Error: double expects an int, not 'Hello'
PYK 2016-07-11: For some time I was under the misapprehension that return -code error message was the "standard" way to throw an error. It's not. error is usually preferable. For one thing, error reports the line number where it was called. More importantly, the purpose of return is to communicate information back to the caller, which is a more general function. return can be considered a sort of restricted eval, providing more power for expressing various runtime conditions, while error and throw are the most direct methods of signalling an error.