How to catch subst exceptions in TCL

288 views Asked by At

Here is a code example:

set my_ref {$undefined_array(some_key)}
set my_val [subst $my_ref]

which returns:

can't read "undefined_array(some_key)": no such variable
    while executing
"subst $my_ref"

According to http://wiki.tcl.tk/1501

Looks like there is no way to catch this right now

1

There are 1 answers

6
Peter Lewerin On BEST ANSWER

When subst attempts to perform substitutions on the text you gave it, it needs an existing variable with a matching name. If no such variable exists, subst throws a TCL LOOKUP VARNAME exception.

How to catch that? You can catch the exception after subst has failed as usual, with catch or try. The discussion you referred to was AFAICT about catching exceptions before subst has failed, which I believe still isn't possible.

ETA:

Proof-of-concept for my "discriminating try" comment. This code has tons of potential problems but at least demonstrates basically how it could be done. In the example, the handler reacts by creating a variable that has its own name in uppercase as value.

# CAUTION: demonstration code, do not use without modification 
proc handler varName {
    upvar 1 $varName name 
    set name [string toupper $varName]
}
unset -nocomplain foo bar 
set baz xyz 
set str {$foo $bar $baz}
while true {
    try {
        subst $str 
    } on ok res {
        break 
    } trap {TCL LOOKUP VARNAME} {msg opts} {
        handler [lindex [dict get $opts -errorcode] end]
    }
}
set res
# -> FOO BAR xyz