为什么TCL CATCH命令不返回错误?

时间:2018-08-24 13:23:31

标签: error-handling tcl

我正在尝试启动一个已编译的代码来处理我编写的TCL脚本所需的大量计算。启动代码时,我正在使用:

if {[catch {exec $cwd/TaubinSmoother &} error_out]} {
    if {[string first "couldn" $error_out] != -1} {
        puts "TaubinSmoother software could not be located."
        exit
    } else {
        puts "$error_out"
    }
}

执行exec命令时,似乎没有错误,但是确实生成了一个错误,因为没有为 TaubinSmoother 运行所需的共享库正确设置PATH环境。 。我尝试使用:

 proc launch {} {
     set error_catch [catch {exec $cwd/TaubinSmoother &} error_out detail]
     return $detail
 }

 set cwd       [file dirname [info script]]
 set error_out launch
 puts "$error_out"

这也没有用,因为我只收到打印到标准输出的“启动”消息。我阅读了TCL, get full error message in catch command和有关catchreturn的更多信息,但是在我的情况下,回答的问题不起作用,手册页上的示例也无济于事。如何获得实际错误以返回到正在运行的脚本,以便可以向未来的用户警告遇到的问题?

1 个答案:

答案 0 :(得分:2)

问题1

您的第二次尝试在“达不到您的期望”的意义上失败了,因为该行

 set error_out launch

应阅读

 set error_out [launch]

背景:原始形式是将文字字符串“启动”分配给变量error_out。因此,这就是您看到的打印内容。

问题2

您的exec在后​​台模式(&)下运行。因此,您的Tcl脚本不再与后台进程相关联。 exec会返回而不会发出任何(背景错误)错误。最好使用openfileevent使用经过子弹验证的Tcl惯用法来检查后台进程:

请参见Detect end of TCL background process in a TCL script