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失败并抛出异常之前拦截它,而不是在抛出异常之前捕获它。这个想法听起来确实有点可疑,而且无论如何,结论似乎是不可行的。听起来像是一个极其错误和混乱的想法。有时候我们只需要告诉别人。我的错,彼得!第一个命令是使用大括号而不是引号(问题已编辑)。问题已解决!正常的尝试