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



在tcl try手册页上,它有以下示例:

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的可能陷阱模式呢?打开的手册页没有提到这一点。对于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错误来自操作系统,您需要猜测系统调用并查找它们。例如,猜测open命令映射到open()系统调用并不是一个很好的方法,因此它在那里记录了错误。有些是Tcl极不可能的(例如,那些与传递坏缓冲区有关的,即POSIX EFAULT),但我们不能保证操作系统不会返回它们,因为操作系统根本没有给我们这种保证

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

  • POSIX类来自操作系统(例如,读取不存在的文件是POSIX ENOENT),并且
  • TCL类来自Tcl自己的内部代码(例如,将错误数量的参数传递给open,这会给你TCL WRONGARGS,或者要求过大的内存分配,如果Tcl设法恢复,这会让你TCL MEMORY)

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

相关内容

最新更新