我正在对文件内容进行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,不会被覆盖
答案 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
可以让您更加精彩。