6

return -code error ...とを介してTCLで例外を発生させることの実際の違いは何error ...ですか?どちらがもう一方の代わりに使用されるのはいつですか?

4

1 に答える 1

7

このerrorコマンドは、現在の時点でエラーを生成します。プロシージャの内部状態が原因で問題が発生する場合に最適です。このreturn -code errorコマンドは、配置されたプロシージャにエラーを生成させます(プロシージャがそうであったかのようにerror)。プロシージャに渡される引数に問題がある場合(つまり、呼び出し元が何か間違ったことをした場合)に最適です。スタックトレースを見ると、実際に違いが生じます。

これが(考案された!)例です:

proc getNumberFromFile {filename} {
    if {![file readable $filename]} {
        return -code error "could not read $filename"
    }
    set f [open $filename]
    set content [read $f]
    close $f
    if {![regexp -- {-?\d+} $content number]} {
        error "no number present in $filename"
    }
    return $number
}

catch {getNumberFromFile no.such.file}
puts $::errorInfo
#could not read no.such.file
#    while executing
#"getNumberFromFile no.such.file"

catch {getNumberFromFile /dev/null}
puts $::errorInfo
#no number present in /dev/null
#    while executing
#"error "no number present in $filename""
#    (procedure "getNumberFromFile" line 9)
#    invoked from within
#"getNumberFromFile /dev/null"
于 2012-05-31T10:24:03.620 に答える