防止Tcl因未知命令而崩溃

防止Tcl因未知命令而崩溃,tcl,Tcl,我正在对文件的内容进行eval。该文件由我解析的标签组成。每行都有一个标签,我为每个标签定义了一个proc,这样eval就成功了。但是,有时用户添加新标签,然后由于未知命令,eval命令失败 在尝试eval未知命令时,是否有方法防止Tcl崩溃? 理想情况下,它应该允许我用自己定义的行为来代替,例如撬开一个错误并继续执行eval 编辑: 不幸的是,我只能使用Tcl 8.4。 我试着做了以下几件事: 然后: rename unknown _old_system_unknown rename han

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

在尝试
eval
未知命令时,是否有方法防止Tcl崩溃?
理想情况下,它应该允许我用自己定义的行为来代替,例如撬开一个错误并继续执行
eval


编辑

不幸的是,我只能使用Tcl 8.4。
我试着做了以下几件事:

然后:

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
,我仍然会得到相同的行为,它会打印以下错误:

未知过程是受保护的过程,不会重命名
未知过程是受保护的过程,不会被覆盖
未知过程是受保护的过程,不会重命名
未知过程是受保护的过程,不会被重写


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

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

这就是你需要做的一切,尽管你可以更喜欢使用。

我想我说的是显而易见的,但评估文件是危险的:任何用户都可以在这样的文件中嵌入
[exec-which-which]


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

谢谢!您能否举例说明如何使用
namespace unknown
命令?我想暂时更改未知命令的处理方式,因此我想知道如何更改然后恢复默认处理方式。@阿米尔:有人严重锁定了您,因此我们没有什么建议(除了在托管系统上阅读文档)。我们已经用这种语言告诉了你标准机制……我很感激你的建议。然而,这并不是对我问题的回答,我认为这应该是一个评论。这是一个非常好的回答。保留一个所有有效标签的列表,如果您刚刚阅读的标签不在该列表中,请调用您自己选择的进程。它准确地解决了问题,并增加了引导的安全性。不适用,但如果您正在读取文件并对其进行评估,那么您也可以选择源文件,不是吗?这个Tcl解释器是在什么环境下使用的?我不熟悉那个“proc保护”错误。@glenn有趣。所以这可能是我公司禁用的东西?我唯一想到的是你被关在一个安全的解释器中,但即使这样也不能阻止你定义一个
未知的
过程。您的Tcl解释器必须是专门构建的,特别偏执。
proc unknown {cmdName args} {
    puts "UNKNOWN COMMAND: $cmdName"
    puts "CALLED WITH ARGUMENTS: $args"
}