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

问题描述 投票:0回答:3

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

error-handling tcl
3个回答
3
投票
当存在需要捕获的特定错误时使用

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


2
投票

各种

POSIX
错误来自操作系统,您需要猜测系统调用并查找它们。例如,猜测
open
命令映射到
open()
系统调用
的范围并不大,因此它记录了错误。有些对于 Tcl 来说是不太可能的(例如,那些与传入错误缓冲区有关的,这是
POSIX EFAULT
),但我们不保证操作系统不会返回它们,因为操作系统根本不向我们提供这种保证.

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

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

我们不太可能详尽地记录所有可能性(尤其是在

TCL
类中),因为许多可能性不太可能出现在正确的代码中。


0
投票

我惊讶地发现没有人提到如何在 *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
© www.soinside.com 2019 - 2024. All rights reserved.