ZetCode

Tcl error 命令

最后修改于 2025 年 4 月 3 日

Tcl 的 error 命令用于生成错误和异常。它允许脚本使用自定义消息来指示错误状况。正确的错误处理可以使脚本更健壮、更易于维护。

基本定义

error 命令会引发一条带有指定消息的错误。除非被 catch 命令捕获,否则它会终止脚本的执行。

语法:error message ?info? ?code?。其中 message 是必需的,而 info 和 code 是可选的。info 提供堆栈跟踪的详细信息。

基本错误生成

此示例展示了 error 命令最简单的用法,用于引发错误。

basic_error.tcl
error "This is a basic error message"

执行时,此脚本将终止并显示错误消息。在引发错误后,将不会执行任何后续命令。

捕获错误

catch 命令可以捕获由 error 引发的错误。

catch_error.tcl
if {[catch {error "Division by zero"} msg]} {
    puts "Caught error: $msg"
}

在这里,我们使用 catch 来阻止脚本终止。错误消息存储在 msg 中,并被打印出来,而不是终止执行。

带有堆栈跟踪的错误

可选的 info 参数可以提供堆栈跟踪信息以供调试。

error_stack.tcl
proc divide {a b} {
    if {$b == 0} {
        error "Division by zero" "Attempted division of $a by $b"
    }
    return [expr {$a / $b}]
}

catch {divide 10 0} msg opts
puts $msg
puts [dict get $opts -errorinfo]

这显示了一个会引发带有堆栈信息的错误的除法函数。catch 捕获了消息和完整的错误信息。

自定义错误代码

错误代码有助于以编程方式对错误进行分类,以便更好地处理。

error_code.tcl
proc validate_age {age} {
    if {$age < 0} {
        error "Invalid age" "" NEGATIVE_AGE
    } elseif {$age > 120} {
        error "Invalid age" "" TOO_OLD
    }
    return $age
}

catch {validate_age -5} msg opts
puts "Error code: [dict get $opts -errorcode]"

此验证函数使用自定义错误代码。调用代码可以检查错误代码来确定具体的验证失败项。

嵌套错误处理

在需要时,可以捕获错误并重新引发,同时添加额外上下文。

nested_error.tcl
proc process_data {data} {
    if {$data eq ""} {
        error "Empty data received"
    }
    # Process data here
}

proc main {} {
    set input ""
    if {[catch {process_data $input} msg]} {
        error "Processing failed: $msg" $::errorInfo
    }
}

catch {main} msg
puts $msg

这显示了嵌套的错误处理,其中捕获了一个低级错误,并添加了额外上下文后重新引发。原始错误信息得以保留。

过程中的错误

过程可以使用 error 来验证输入并报告问题。

proc_error.tcl
proc calculate_area {width height} {
    if {$width <= 0 || $height <= 0} {
        error "Dimensions must be positive"
    }
    return [expr {$width * $height}]
}

if {[catch {calculate_area 0 10} msg]} {
    puts "Calculation error: $msg"
} else {
    puts "Area: $msg"
}

此过程在计算之前验证其输入。无效的尺寸会触发一个错误,该错误可以被调用代码捕获。

最佳实践

本教程涵盖了 Tcl 的 error 命令,并提供了实际示例,展示了其在不同错误处理场景中的用法。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Tcl 教程