如何让 tcl 脚本在出错时继续运行?

问题描述 投票:0回答:1

我是新来的。 我有一个文件 file1.tcl:

set a "MY_TEST"
set b [format "%.1f" [expr $a-3]]
puts $b
puts $a

我无法修改file1, 我使用另一个文件 file2.tcl 来获取 file1:

文件2.tcl:

catch { source file1.tcl } result

当放入$b时,它会显示错误表达式“$a -3”,正如预期的那样

我想让tcl显示这个错误,但还要继续放入$a,该怎么做? (有办法在出错时自动将 b 设置为 0 吗?)

error-handling tcl
1个回答
0
投票

Tcl 的设计目的不是这样工作的;一旦解释器遇到错误(或其他异常情况),它就会向外展开,直到找到处理错误的东西。您可以设置执行跟踪来观察这一点,但您无法更改结果元组的内容。关键问题是你并不真正知道在这种情况下“应该”是什么状态;你只知道它是什么,一个错误。 您可以将

expr

替换为您自己的版本(使用子解释器 - 请参阅

interp create
- 如果您打算这样做;请参阅下文)来处理错误并替换其他内容,但这确实很容易使代码变得混乱。我不推荐它,因为你并不真正知道脚本正在使用
expr
提前做什么。
interp create helper
helper eval {
    rename expr realExpr
    proc expr args {
        try {
            return [uplevel 1 [list realExpr {*}$args]]
        } on error {msg} {
            puts "WARNING: $msg"
            return 0
        }
    }
}

set result [helper eval {source file1.tcl}]

© www.soinside.com 2019 - 2024. All rights reserved.