我的问题的背景:我想编写一个错误程序,它会写出一条有助于识别错误情况的附加消息。我有一些代码部分提供了这些附加信息,而其他部分则没有。我的想法是:
- 将全局消息变量
message
设置为空字符串 message
在调用可能导致错误的过程之前创建一个本地消息变量- 在错误过程中:向下搜索变量的所有级别
message
并获取找到的第一个变量的值
我也可以设置一个全局message
变量并始终访问它,但是之后我必须重新设置它(以防止其他未设置的部分出现恼人的错误消息message
)。
我写了一个searchVar
程序:
proc searchVar {varname} {
set thisLevel [info level]
for {set lvl 0} {$lvl <= $thisLevel} {incr lvl} {
upvar $lvl $varname var
if {[info exists var]} {
return $var
}
}
return ""
}
这是一些测试代码:
set message "value at global level"
proc withoutlocal1 {} {
puts "withoutlocal1 message = [searchVar message]"
}
proc withoutlocal2 {} {
puts "withoutlocal2 message = [searchVar message]"
withoutlocal1
}
proc withlocal {} {
set message "value at withlocal level"
puts "withlocal message = [searchVar message]"
withoutlocal2
}
withoutlocal1
puts ""
withoutlocal2
puts ""
withlocal
这使
withoutlocal1 message = value at global level
withoutlocal2 message = value at global level
withoutlocal1 message = value at global level
withlocal message = value at withlocal level
withoutlocal2 message = value at withlocal level
withoutlocal1 message = value at withlocal level
这给出了所需的行为: 的值message
是定义的最后一个(相对于调用顺序)。
我的问题是:是否有更紧凑或“规范”的解决方案searchVar
?还是对整个问题的更优雅的解决方案?