为什么我不能访问errorInfo和errorCode

时间:2017-05-27 04:12:48

标签: tcl

我有以下代码:

Map<String, Multiset<Long>> map = Maps.transformValues(
    result.rowMap(),
    m -> HashMultiset.create(m.values()));

当我采购它时,我得到错误访问errorCode:

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

p1

我尝试更改为$ :: errorCode,但没有帮助。

你能看出出了什么问题吗?

2 个答案:

答案 0 :(得分:2)

errorInfoerrorCode变量是全局变量。您应该使用global命令将它们带入范围或使用其完全限定的名称(即,在::之前)。

从结果选项字典中选择信息可能更容易(8.5中的新功能)。

答案 1 :(得分: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"