2017-05-27 97 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 

當我採購它,我得到錯誤訪問錯誤碼:

$ 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'),對我來說工作正常。請注意,您還需要限定'zero'。 –

回答

2

errorInfoerrorCode變量是全局。您應該使用global命令將它們納入範圍或使用其完全限定名稱(即以::開頭)。

從結果選項字典中選取信息可能更容易(8.5中的新功能)。

1

從Tcl 8.5開始[catch]未設置全局變量errorCodeerrorInfo(正如Donal指出的那樣,它仍然可以,因此可以按$::errorCode$::errorInfo訪問)。此外,它將它們的值放入一個字典中,該字典的名稱將被指定爲第三個參數。下面的代碼

#!/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 

打印

errorCode=NONE 
errorInfo=can't read "zero": no such variable 
    while executing 
"expr 1/$zero" 
在Tcl的條款8.5.19

,和

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

你可能想使用$::zero在分割後的結果將是

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

變量仍然設置。他們還是_globals_。 –

+0

對,謝謝你的澄清。我編輯了答案。 –

+0

現在你的回答是正確和有用的,所以我可以投票。 –

相關問題