如何检查Tcl命令没有';t抛出异常或错误?

如何检查Tcl命令没有';t抛出异常或错误?,tcl,Tcl,我有以下程序: proc myexec { args } { info_msg "Executing shell command: $args" set catch_res [catch {eval exec $args} res] if { $catch_res != 0 } { error_msg "Failed in command: $args" error_msg "$res" } return $catc

我有以下程序:

proc myexec { args } {
    info_msg "Executing shell command: $args"

    set catch_res [catch  {eval exec $args} res]

    if { $catch_res != 0 } {
        error_msg "Failed in command: $args"
        error_msg "$res"
    }

    return $catch_res
}
它只检查Unix命令,不适用于Tcl命令。 如何更改此过程以使其与Tcl命令一起工作

例如,如果要检查以下命令的计算结果是否正确:

set object1 $object2


如果您只想修改此过程,使其运行作为Tcl命令而不是Unix命令传递的参数,只需删除exec,即,不必执行
eval exec$args
,只需执行
eval$args


让一个过程同时处理Tcl和Unix命令比较困难,但Tcl已经为您在tclsh或wish中键入的命令执行了这一操作—它首先查找内置命令,如果找不到,则尝试将其作为Unix命令运行。您可以在脚本中通过执行
set::tcl_interactive 1
-有关详细信息,请参见最简单的方法是:

proc myeval { args } {
    info_msg "Executing Tcl command: $args"

    set catch_res [catch $args res]

    if { $catch_res != 0 } {
        error_msg "Failed in command: $args"
        error_msg "$res"
    }

    return $res
}
这里,我们用
catch$args res
替换了
catch{eval exec$args}res
(加上一些修饰性的东西),这将导致参数作为脚本计算,而无需进一步替换。您可以这样使用它:

myeval foo bar $boo
myeval {
    foo bar $boo
}
或者,如果您也在
catch
中进行替换,那么最好编写这个更复杂的版本:

proc myeval { script } {
    info_msg "Executing Tcl command: [string trim $script]"

    set catch_res [catch [list uplevel 1 $script] res]

    if { $catch_res != 0 } {
        error_msg "Failed in command: [string trim $script]"
        error_msg "$res"
    }

    return $res
}
在这种情况下,您可以这样称呼它:

myeval foo bar $boo
myeval {
    foo bar $boo
}

注意:我已经试着保持代码的模式与问题中的相同。