1

我有以下过程,它基本上在字典中查找几个值并将它们作为列表返回。

proc GetAllow { PID Ply } {

# read a dictonary from a file
catch {

append PlyAndDirXt $Ply "_xt"
append PlyAndDirYt $Ply "_yt"

set x_allow_tens [ dict get $allowables $PID $PlyAndDirXt ]
set y_allow_tens [ dict get $allowables $PID $PlyAndDirYt ]
set allowables [ list $x_allow_tens $y_allow_tens ]

} res

if { $res == 0 } {
  return $allowables
} 
if { $res != 0 } {
  return 999
}    

}

据我了解,如果一切正常,“catch”$res 应该是 0 = TCL_OK。在这种情况下,我希望 proc 返回列表 $allowables。如果由于没有匹配的键而在字典中找不到值。我希望它返回 999。但我总是返回 999。我在这里做错了什么?

4

1 回答 1

4

根据手册

如果脚本引发错误,catch 将返回一个非零整数值,该值对应于脚本评估返回的异常返回码。Tcl 将脚本评估的正常返回码定义为零 (0) 或 TCL_OK。

如果给出了 varName 参数,那么它命名的变量将设置为脚本评估的结果。当脚本的返回码为 1 (TCL_ERROR) 时,存储在 varName 中的值是一条错误消息。当脚本的返回码为 0(TCL_OK)时,resultVarName 中存储的值就是脚本返回的值。

因此,除非脚本的结果返回 0 ,否则$res不会等于。0

您可以设置catch为这样的变量:

set err [catch {

    append PlyAndDirXt $Ply "_xt"
    append PlyAndDirYt $Ply "_yt"
    
    set x_allow_tens [ dict get $allowables $PID $PlyAndDirXt ]
    set y_allow_tens [ dict get $allowables $PID $PlyAndDirYt ]
    set allowables [ list $x_allow_tens $y_allow_tens ]

} res]

然后检查

if { $err == 0 } {
  return $allowables ;# Or return $res since that's the last evaluated line
} 
if { $err != 0 } {
  return 999
}  
于 2013-09-26T10:33:17.323 回答