如何找出tcl命令会产生哪些错误?

时间:2019-01-18 03:07:36

标签: error-handling tcl

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中给定的任意命令,如何找出可能的错误?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

各种POSIX错误来自操作系统,因此您需要对系统调用进行猜测并进行查找。例如,猜测open命令映射到open() system call并不是一个很大的尝试,因此这里记录了错误。有些Tcl不太可能(例如,与传递错误的缓冲区有关的POSIX EFAULT),但是我们不保证OS不会返回它们,因为OS根本没有提供保证给我们。

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

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

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