Tcl:捕获所有命令的错误
Tcl: catch errors from all commands
抱歉,我想不出更好的标题。我的问题如下:如果我执行 Tcl proc
,我可以将执行包装在 catch
中以捕获和处理错误。我在我的代码中这样做是为了在所有地方输出相同的错误。但是,我的程序提供了许多 proc
,用户可以在脚本中使用它们(主要是在最外层),如果用户必须将它们中的每一个都包装在 catch
中,那将很麻烦.我当然可以在这些命令中的每一个中使用额外的间接级别,但我想问一下是否有一种方法可以从执行的 all 命令中 catch
错误,而无需明确在每次调用时使用 catch
?
感谢您的帮助!
先读这一段:↓
错误处理的最重要原则是不要丢弃错误,除非您确定这是处理错误的正确方法。 仅仅因为它们难看就这样做 非常糟糕!(记录它们要好得多。)
最接近的是 运行 整个现有代码在 catch
或 try
中。你可以在里面放一个 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
。
抱歉,我想不出更好的标题。我的问题如下:如果我执行 Tcl proc
,我可以将执行包装在 catch
中以捕获和处理错误。我在我的代码中这样做是为了在所有地方输出相同的错误。但是,我的程序提供了许多 proc
,用户可以在脚本中使用它们(主要是在最外层),如果用户必须将它们中的每一个都包装在 catch
中,那将很麻烦.我当然可以在这些命令中的每一个中使用额外的间接级别,但我想问一下是否有一种方法可以从执行的 all 命令中 catch
错误,而无需明确在每次调用时使用 catch
?
感谢您的帮助!
先读这一段:↓
错误处理的最重要原则是不要丢弃错误,除非您确定这是处理错误的正确方法。 仅仅因为它们难看就这样做 非常糟糕!(记录它们要好得多。)
最接近的是 运行 整个现有代码在 catch
或 try
中。你可以在里面放一个 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
。