2017-05-27 11 views
0

にアクセスすることはできません。は、なぜ私は、次のコードを持っているのerrorInfoとerrorCodeを

$ cat ~/tmp/2.tcl 
set zero 0 
proc p1 {} { 
    if {[catch {expr 1/$zero} err]} { 
     puts "errorCode=$errorCode" 
     puts "errorInfo=$errorInfo" 
    } 
} 

p1 

私はそれを調達するとき、私はのerrorCodeにアクセスするときにエラーが出ます:

$ tclsh ~/tmp/2.tcl 
can't read "errorCode": no such variable 
    while executing 
"puts "errorCode=$errorCode"" 
    (procedure "p1" line 3) 
    invoked from within 
"p1" 
    (file "~/tmp/2.tcl" line 9) 

私が$ ::を変えてみましたerrorCode、しかし助けにはならなかった。

何が間違っていますか?

+0

変数名が修飾されると正しく動作します(たとえば、 'errorCode'ではなく' :: errorCode')。 「ゼロ」を修飾する必要があることに注意してください。 –

答えて

2

errorInfoerrorCode変数はグローバルあるだろうそのあと部門で$::zeroを使用したいと思います。 globalコマンドを使用してスコープに入れるか、完全修飾名を使用してください(つまり、先に::)。

結果オプション辞書(8.5の新機能)から情報を選択する方が簡単かもしれません。

1

Tclから始まる8.5 [catch]は、グローバル変数errorCodeerrorInfoを設定しません。(Donalは指摘しているとおり、それはまだ行われますので、$::errorCode$::errorInfoとしてアクセスできます)。さらに、それらの値を辞書に入れて、その名前を第3引数として指定します。次のコード

#!/usr/bin/tclsh 

set zero 0 
proc p1 {} { 
    if {[catch {expr 1/$zero} err opts] == 1} { 
     puts "errorCode=[dict get $opts -errorcode]" 
     puts "errorInfo=[dict get $opts -errorinfo]" 
    } 
} 

p1 

プリントTclの8.5.19に

errorCode=NONE 
errorInfo=can't read "zero": no such variable 
    while executing 
"expr 1/$zero" 

、及びTcl8.6.6で

errorCode=TCL READ VARNAME 
errorInfo=can't read "zero": no such variable 
    while executing 
"expr 1/$zero" 

あなたは、おそらく結果は

errorCode=ARITH DIVZERO {divide by zero} 
errorInfo=divide by zero 
    while executing 
"expr 1/$::zero" 
+0

変数はまだ設定されています。彼らはまだ_globals_です。 –

+0

ご連絡ありがとうございます。私は答えを編集しました。 –

+0

あなたの答えは正当で有用なので、私はそれを投票することができます。 –

関連する問題