如何在 TCL 中捕获 subst 异常
How to catch subst exceptions in TCL
这是一个代码示例:
set my_ref {$undefined_array(some_key)}
set my_val [subst $my_ref]
哪个returns:
can't read "undefined_array(some_key)": no such variable
while executing
"subst $my_ref"
Looks like there is no way to catch this right now
当 subst
尝试对您提供的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst
将抛出一个 TCL LOOKUP VARNAME
异常。
如何捕捉?您可以在 subst
像往常一样失败后捕获异常 ,使用 catch
或 try
。您提到的讨论是关于捕获异常的 AFAICT before subst
失败了,我认为这仍然是不可能的。
预计到达时间:
我的 "discriminating try" 评论的概念验证。这段代码有很多潜在的问题,但至少基本上演示了它是如何完成的。在该示例中,处理程序通过创建一个变量来做出反应,该变量具有自己的大写名称作为值。
# 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
这是一个代码示例:
set my_ref {$undefined_array(some_key)}
set my_val [subst $my_ref]
哪个returns:
can't read "undefined_array(some_key)": no such variable
while executing
"subst $my_ref"
Looks like there is no way to catch this right now
当 subst
尝试对您提供的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst
将抛出一个 TCL LOOKUP VARNAME
异常。
如何捕捉?您可以在 subst
像往常一样失败后捕获异常 ,使用 catch
或 try
。您提到的讨论是关于捕获异常的 AFAICT before subst
失败了,我认为这仍然是不可能的。
预计到达时间:
我的 "discriminating try" 评论的概念验证。这段代码有很多潜在的问题,但至少基本上演示了它是如何完成的。在该示例中,处理程序通过创建一个变量来做出反应,该变量具有自己的大写名称作为值。
# 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