Как отлавливать подстановочные исключения в 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