2012-05-30 3 views

答えて

5

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" 
+0

は違いはあなたがトラップするプロシージャ内で 'catch'を使用する場合は、二つの異なる場合もありますが、それは多くがより複雑になってきました。 –

+1

おそらく、Tcl 8.5の 'return'がスタックの上位のどこかでエラーを発生させるために使用できる' -level'オプションを学んだので、それは言及する価値があります。これはカスタム複合コマンドを実装するときに使用できます(通常DSL )。 'error'はそれを行うことができません。 – kostix

関連する問題