我有以下代码:
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,但没有帮助。
你能看出出了什么问题吗?
答案 0 :(得分:2)
errorInfo
和errorCode
变量是全局变量。您应该使用global
命令将它们带入范围或使用其完全限定的名称(即,在::
之前)。
从结果选项字典中选择信息可能更容易(8.5中的新功能)。
答案 1 :(得分:1)
从Tcl 8.5开始(正如Donal指出的那样,它仍然存在,因此可以[catch]
没有设置errorCode
和errorInfo
全局变量。$::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"