2011-09-08 85 views
4

我有以下步驟:如何檢查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 $catch_res 
} 

只檢查Unix命令,不與Tcl命令工作。 如何更改此程序以使其能夠與Tcl命令一起使用?

例如,如果我要檢查以下命令計算沒有錯誤:

set object1 $object2 

open $filename r 

回答

1

如果你只是想這樣它會作爲傳遞的參數修改對此過程一個Tcl命令,而不是一個Unix命令,只需刪除exec,即。而不是eval exec $args只是做eval $args

使單個過程處理Tcl和Unix命令都比較困難,但Tcl已經爲您在tclsh或wish中鍵入的命令執行此操作 - 它首先查找內置命令,如果它沒有找到它,試圖將它作爲Unix命令運行。您可以通過執行set ::tcl_interactive 1打開這種行爲在腳本 - 在Tcl Wiki

3

更多信息最簡單的方法是做到這一點:

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 {eval exec $args} rescatch $args res(加上一些裝飾的東西)這將導致參數被評估爲一個腳本而沒有進一步的替代。你會使用這樣的:

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 
} 
+0

注意:我試圖保持代碼的模式與問題中的模式相同。 –

+0

非常感謝你! – user782642