2011-05-11 61 views
6

我在做eval上的文件內容。該文件是由我解析的標籤製成的。每行都有一個標籤,並且我爲每個標籤定義了一個proc,以便eval成功。但是,有時用戶會添加新標籤,然後eval命令因命令未知而失敗。防止Tcl在未知命令上崩潰

有沒有辦法可以防止Tcl在嘗試eval未知命令時崩潰?
理想情況下,它應該允許我用我自己定義的行爲進行替換 - 例如引發錯誤並繼續使用eval


編輯

不幸的是,我只能用到Tcl 8.4。
我試着做以下,as suggested here

proc handle_unknown_label {cmd args} { ... } 

然後:

rename unknown _old_system_unknown 
rename handle_unknown_label unknown 

catch {set ret [eval $x]} err 

rename unknown handle_unknown_label 
rename _old_system_unknown unknown 

,但我仍然得到了eval相同的行爲,並印刷了以下錯誤:

程序未知是受保護的過程,不會被重命名
程序未知是一個專業程序tected proc和將不會重寫
程序未知是受保護的proc和不會獲得改名
程序未知是受保護的proc和將不會重寫

+1

不適用,但如果您正在閱讀文件並對其進行評估,那麼您可以直接輸入文件,而不是? – 2011-05-11 10:51:06

+1

這個Tcl解釋器在什麼環境下?我不熟悉那個「受保護的proc」錯誤。 – 2011-05-11 12:57:39

+0

@glenn有趣。所以這可能是我公司禁用的東西? – 2011-05-11 13:35:57

回答

2

實現自己的命令叫unknown,這需要作爲其參數所有構成無法找到該命令的話和ARGS:

proc unknown {cmdName args} { 
    puts "UNKNOWN COMMAND: $cmdName" 
    puts "CALLED WITH ARGUMENTS: $args" 
} 

這是對所有你需要做的,但你可以得到與使用namespace unknown票友。

+0

謝謝!你可以舉一個如何使用'namespace unknown'命令的例子嗎?我想暫時更改對未知命令的處理,所以我想知道如何更改並恢復默認處理。 – 2011-05-11 07:51:02

+0

請參閱我的編輯 – 2011-05-11 10:14:59

+0

@Amir:有人嚴重鎖定了你,所以我們沒有太多建議(除了可能閱讀主機系統上的文檔)。我們已經告訴過你語言的標準機制... – 2011-05-11 14:41:29

3

我想我說的很明顯,但eval'文件是危險的:任何用戶可以嵌入[exec whatever they wish]到這樣的文件。

更好的辦法是閱讀這些「標籤」,並使用giantic開關或哈希映射或任何其他來執行預定的命令。捕捉不存在的「標籤」也不成問題。

+0

我很欣賞這個建議。但是,這不是我的問題的答案,我認爲這應該是一個評論。 – 2011-05-11 10:23:56

+0

這是一個很好的答案TBH。保留所有有效標籤的列表,如果您剛剛閱讀的標籤不在該列表中,請調用您自己選擇的過程。它完全解決了這個問題,並增加了啓動的安全性。 – ZoFreX 2014-10-06 11:42:37