2013-09-26 30 views
1

我有以下proc,它基本上在dictonary中查找兩個值,並將它們作爲列表返回。在簡單的tcl proc中使用catch的問題

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 
}  

}

據我瞭解 「捕捉」 如果一切順利$資源應該是0 = TCL_OK。在這種情況下,我希望proc返回$ allowables列表。 如果由於沒有匹配的鍵而在字典中找不到值。我希望它返回999.但我總是回到999。我在這裏做錯了什麼?

回答

4

由於每manual

如果腳本引發錯誤,抓將返回對應於腳本的評估返回的特殊返回碼非零整數值。 Tcl將腳本評估的正常返回碼定義爲零(0)或TCL_OK。

如果給出varName參數,那麼它所命名的變量將被設置爲腳本評估的結果。當腳本的返回碼爲1(TCL_ERROR)時,存儲在varName中的值是錯誤消息。當腳本的返回碼爲0(TCL_OK)時,存儲在resultVarName中的值是從腳本返回的值。

因此,$res將不等於0除非你的腳本的結果返回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 
}