在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中给定的任意命令,如何找出可能的错误?
答案 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."
}
答案 1 :(得分:1)
各种POSIX
错误来自操作系统,因此您需要对系统调用进行猜测并进行查找。例如,猜测open
命令映射到open()
system call并不是一个很大的尝试,因此这里记录了错误。有些Tcl不太可能(例如,与传递错误的缓冲区有关的POSIX EFAULT
),但是我们不保证OS不会返回它们,因为OS根本没有提供保证给我们。
我们应该从涉及操作系统的命令中记录最有可能的命令,但要有较高的水平:
POSIX
类是来自操作系统的(例如,读取不存在的文件为POSIX ENOENT
),并且TCL
类来自Tcl自己的内部代码(例如,将错误数量的参数传递给open
,这会给您TCL WRONGARGS
,或请求太大的内存)分配,如果Tcl设法恢复,则为您提供TCL MEMORY
。我们不太可能详尽地记录所有可能性(尤其是在TCL
类中),因为许多可能性不可能使用正确的代码。