在 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
的可能陷阱模式? open manpage 没有提到它。对于tcl中给定的任意命令,我如何找出可能的错误是什么?
各种
POSIX
错误来自操作系统,您需要猜测系统调用并查找它们。例如,猜测 open
命令映射到 open()
系统调用 的范围并不大,因此它记录了错误。有些对于 Tcl 来说是不太可能的(例如,那些与传入错误缓冲区有关的,这是 POSIX EFAULT
),但我们不保证操作系统不会返回它们,因为操作系统根本不向我们提供这种保证.
我们应该从涉及操作系统的命令中记录最有可能的命令,但要在较高的级别上:
POSIX
类来自操作系统(例如,读取不存在的文件是POSIX ENOENT
),并且TCL
类来自Tcl自己的内部代码(例如,将错误数量的参数传递给open
,这会给你TCL WRONGARGS
,或者要求太大的内存分配,这会给你TCL MEMORY
如果 Tcl 能够恢复的话)。我们不太可能详尽地记录所有可能性(尤其是在
TCL
类中),因为许多可能性不太可能出现在正确的代码中。
我惊讶地发现没有人提到如何在 *NIX 系统上列出 POSIX 错误(不能保证所有,但在我尝试过的少数系统上做到了)。
回答您的(扩展)问题: 如何找出可能出现的错误(来自操作系统)?
errno --list | grep file
短期权形式是
-ls
(甚至是 -l
)。
您可以看到所有没有 grep
的 POSIX 错误。
输出线的形式为:
ERRNAME errcode error message
示例:
ENOENT 2 No such file or directory
EISDIR 21 Is a directory