Tcl:捕获所有命令的错误

Tcl: catch errors from all commands

抱歉,我想不出更好的标题。我的问题如下:如果我执行 Tcl proc,我可以将执行包装在 catch 中以捕获和处理错误。我在我的代码中这样做是为了在所有地方输出相同的错误。但是,我的程序提供了许多 proc,用户可以在脚本中使用它们(主要是在最外层),如果用户必须将它们中的每一个都包装在 catch 中,那将很麻烦.我当然可以在这些命令中的每一个中使用额外的间接级别,但我想问一下是否有一种方法可以从执行的 all 命令中 catch 错误,而无需明确在每次调用时使用 catch

感谢您的帮助!

先读这一段:↓

错误处理的最重要原则是不要丢弃错误,除非您确定这是处理错误的正确方法。 仅仅因为它们难看就这样做 非常糟糕!(记录它们要好得多。)


最接近的是 运行 整个现有代码在 catchtry 中。你可以在里面放一个 source ,所以一个小的驱动程序脚本来改造现有的代码就像:

set argc [llength [set argv [lassign $argv argv0]]]
catch {source $argv0}

假设您在调用整个脚本期间应用它。您可能还需要设置 interp bgerror:

interp bgerror {} {apply {{msg opt} {
    if {[lindex [dict get $opt -errorcode] 0] eq "EXPECTED"} {
        # Ignore this
    } else {
        # Unexpected error; better tell the user
        puts "ERROR: $msg"
        puts [dict get $opt -errorinfo]
    }
}}}

虽然这样做并不是一个好主意。 如果您隐藏了所有错误,您将如何找到并修复任何错误?使用 try 更好,因为这样可以仅隐藏预期的错误:

try {
    source $argv0
} trap EXPECTED {} {
    # Ignore this
}

而且我可能会把事情总结起来,这样我就有了局部变量:

apply {{} {
    global argv0 argv argc
    set argc [llength [set argv [lassign $argv argv0]]]
    try {
        uplevel #0 [list source $argv0]
    } trap EXPECTED {msg} {
        # Log this; the logging engine is out of scope for the question
        log DEBUG $msg
    }
}}

您需要进行试验以了解trap