我如何找出 tcl 命令可能产生的错误?

How do I find out what errors a tcl command can generate?

tcl try manpage处有如下例子:

try {
    set f [open /some/file/name w]
} trap {POSIX EISDIR} {} {
    puts "failed to open /some/file/name: it's a directory"
} trap {POSIX ENOENT} {} {
    puts "failed to open /some/file/name: it doesn't exist"
}

太好了,它有效,但我怎么会发现 {POSIX ENOENT}open 的可能陷阱模式? open manpage 没有提到它。对于 tcl 中给定的任意命令,我如何找出可能的错误是什么?

try {} trap {}在有特定错误需要捕获时使用。 对于更一般的陷阱,请使用 try {} on error {}.

try {
   set fh [open myfile.txt w]
} on error {err res} {
   puts "Error on open: $res"
}

还有catch命令:

if { [catch {set fh [open myfile.txt w]}] } {
   puts "error on open."
}

参考文献:try catch

各种POSIX错误来自OS,您需要猜测系统调用并查找它们。例如,猜测 open 命令映射到 open() system call 并不是一个很好的范围,因此它在那里记录了错误。有些对于 Tcl 来说是极不可能的(例如,那些与传递错误缓冲区有关的 POSIX EFAULT),但我们不保证 OS 不会 return 它们,因为OS 根本没有给我们这样的保证。

我们应该从涉及操作系统的命令中记录最有可能的命令,但在较高级别:

  • POSIXclass来自OS(例如,读取一个不存在的文件是POSIX ENOENT),
  • TCL class 那些来自 Tcl 自己的内部代码(例如,将错误数量的参数传递给 open,这给你 TCL WRONGARGS,或者要求太大的内存分配,如果 Tcl 设法恢复,这会给你TCL MEMORY

我们不太可能详尽记录所有可能性(尤其是在 TCL class 中),因为许多可能性不太可能是正确的代码。