5
TCLで例外を発生させるのは実際にはreturn -code error ...
とerror ...
の違いは何ですか?いつ他のものの代わりに1つが使用されますか?戻りコードエラーとエラーの相違点
TCLで例外を発生させるのは実際にはreturn -code error ...
とerror ...
の違いは何ですか?いつ他のものの代わりに1つが使用されますか?戻りコードエラーとエラーの相違点
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"
は違いはあなたがトラップするプロシージャ内で 'catch'を使用する場合は、二つの異なる場合もありますが、それは多くがより複雑になってきました。 –
おそらく、Tcl 8.5の 'return'がスタックの上位のどこかでエラーを発生させるために使用できる' -level'オプションを学んだので、それは言及する価値があります。これはカスタム複合コマンドを実装するときに使用できます(通常DSL )。 'error'はそれを行うことができません。 – kostix