防止Tcl在未知命令上崩溃

时间:2011-05-11 07:40:42

标签: tcl

我正在对文件内容进行eval。该文件由我解析的标签组成。每行都有一个标签,我为每个标签定义了proc,以便eval成功。但是,有时用户添加新标签,然后eval命令失败,因为命令未知。

在尝试eval未知命令时,有没有办法防止Tcl崩溃? 理想情况下,它应该允许我用我自己定义的行为替换 - 例如引用错误并继续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获得相同的行为,并打印出以下错误:

  

过程未知是受保护的过程,不会重命名为   程序未知是受保护的过程,不会被覆盖   procedure unknown是受保护的proc,不会被重命名为   procedure unknown是受保护的proc,不会被覆盖

2 个答案:

答案 0 :(得分:3)

我认为我说的很明显,但是eval'文件很危险:任何用户都可以将[exec whatever they wish]嵌入到这样的文件中。

更好的方法是阅读这些“标签”并使用giantic开关或哈希映射或其他任何内容来执行预定的命令。捕获不存在的“标签”也不成问题。

答案 1 :(得分:2)

实现自己的名为unknown的命令,该命令将构成无法找到的命令的所有单词及其参数作为参数:

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

这就是您需要做的所有事情,尽管使用namespace unknown可以让您更加精彩。