Exception 如何在TCL中捕获subst异常
下面是一个代码示例:Exception 如何在TCL中捕获subst异常,exception,tcl,subst,Exception,Tcl,Subst,下面是一个代码示例: 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" 据 看来现在没办法抓住这个 当substict尝试对给定的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst抛出T
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"
据
看来现在没办法抓住这个
当
substict
尝试对给定的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst
抛出TCL LOOKUP VARNAME
异常
怎么抓住那个?使用catch
或try
可以在subst
像往常一样失败后捕获异常。您提到的讨论是关于在subst
失败之前捕获异常的,我认为这仍然是不可能的
预计到达时间:
我的“有鉴赏力的尝试”评论的概念证明。这段代码有很多潜在的问题,但至少基本上演示了如何做到这一点。在本例中,处理程序通过创建一个变量来做出反应,该变量的值为其自己的大写名称
# 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
当
substict
尝试对给定的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst
抛出TCL LOOKUP VARNAME
异常
怎么抓住那个?使用catch
或try
可以在subst
像往常一样失败后捕获异常。您提到的讨论是关于在subst
失败之前捕获异常的,我认为这仍然是不可能的
预计到达时间:
我的“有鉴赏力的尝试”评论的概念证明。这段代码有很多潜在的问题,但至少基本上演示了如何做到这一点。在本例中,处理程序通过创建一个变量来做出反应,该变量的值为其自己的大写名称
# 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
当
substict
尝试对给定的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst
抛出TCL LOOKUP VARNAME
异常
怎么抓住那个?使用catch
或try
可以在subst
像往常一样失败后捕获异常。您提到的讨论是关于在subst
失败之前捕获异常的,我认为这仍然是不可能的
预计到达时间:
我的“有鉴赏力的尝试”评论的概念证明。这段代码有很多潜在的问题,但至少基本上演示了如何做到这一点。在本例中,处理程序通过创建一个变量来做出反应,该变量的值为其自己的大写名称
# 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
当
substict
尝试对给定的文本执行替换时,它需要一个具有匹配名称的现有变量。如果不存在这样的变量,subst
抛出TCL LOOKUP VARNAME
异常
怎么抓住那个?使用catch
或try
可以在subst
像往常一样失败后捕获异常。您提到的讨论是关于在subst
失败之前捕获异常的,我认为这仍然是不可能的
预计到达时间:
我的“有鉴赏力的尝试”评论的概念证明。这段代码有很多潜在的问题,但至少基本上演示了如何做到这一点。在本例中,处理程序通过创建一个变量来做出反应,该变量的值为其自己的大写名称
# 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
我的错,彼得!第一个命令是使用大括号而不是引号(问题已编辑)。问题已解决!正常的try/catch按预期工作。是否在抛出异常之前捕获异常?这有什么意义?(Tcl的语义是严格可操作的。当它被告知要做什么时,它就做什么。有时这涉及到推迟,但这只是因为它被告知要做什么。)@DonalFellows:如果我正确理解了讨论,那么想法是在查找错误导致subst失败并抛出异常之前拦截它,而不是在抛出异常之前捕获它。这个想法听起来确实有点可疑,而且无论如何,结论似乎是不可行的。听起来像是一个极其错误和混乱的想法。有时候我们只需要告诉别人。我的错,彼得!第一个命令是使用大括号而不是引号(问题已编辑)。问题已解决!正常的try/catch按预期工作。是否在抛出异常之前捕获异常?这有什么意义?(Tcl的语义是严格可操作的。当它被告知要做什么时,它就做什么。有时这涉及到推迟,但这只是因为它被告知要做什么。)@DonalFellows:如果我正确理解了讨论,那么想法是在查找错误导致subst失败并抛出异常之前拦截它,而不是在抛出异常之前捕获它。这个想法听起来确实有点可疑,而且无论如何,结论似乎是不可行的。听起来像是一个极其错误和混乱的想法。有时候我们只需要告诉别人。我的错,彼得!第一个命令是使用大括号而不是引号(问题已编辑)。问题已解决!正常的try/catch按预期工作。是否在抛出异常之前捕获异常?这有什么意义?(Tcl的语义是严格可操作的。当它被告知要做什么时,它就做什么。有时这涉及到推迟,但这只是因为它被告知要做什么。)@DonalFellows:如果我正确理解了讨论,那么想法是在查找错误导致subst失败并抛出异常之前拦截它,而不是在抛出异常之前捕获它。这个想法听起来确实有点可疑,而且无论如何,结论似乎是不可行的。听起来像是一个极其错误和混乱的想法。有时候我们只需要告诉别人。我的错,彼得!第一个命令是使用大括号而不是引号(问题已编辑)。问题已解决!正常的尝试