Как отлавливать подстановочные исключения в TCL

Вот пример кода:

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

который возвращает:

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

Согласно http://wiki.tcl.tk/1501

Похоже, сейчас нет возможности поймать это

1 ответ

Решение

Когда subst пытается выполнить подстановку текста, который вы ему дали, ему нужна существующая переменная с соответствующим именем. Если такой переменной не существует, subst бросает TCL LOOKUP VARNAME исключение.

Как это поймать? Вы можете поймать исключение после subst потерпел неудачу как обычно, с catch или же try, Вы упомянули AFAICT о ловле исключений до subst потерпел неудачу, что, я считаю, все еще невозможно.

ETA:

Подтверждение концепции моего комментария о "различающей попытке". Этот код имеет массу потенциальных проблем, но, по крайней мере, демонстрирует, как это можно сделать. В этом примере обработчик реагирует, создавая переменную с собственным именем в верхнем регистре в качестве значения.

# 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
Другие вопросы по тегам