Tcl 如何避免错误:没有这样的环境变量?

Tcl 如何避免错误:没有这样的环境变量?,tcl,Tcl,在我的代码中,我使用的是环境变量,但如果它(env.var)不存在,我会得到错误消息NAME_env_var:no-this-variable,我的脚本将停止执行。 例如,在队列中 myeval $env($File) 我收到一个错误: can't read "env(NIKE_TECH_DIR)": no such variable while executing "myeval $env($File)" (procedure "chooseRelevantFiles"

在我的代码中,我使用的是环境变量,但如果它(env.var)不存在,我会得到错误消息NAME_env_var:no-this-variable,我的脚本将停止执行。 例如,在队列中

 myeval $env($File)
我收到一个错误:

 can't read "env(NIKE_TECH_DIR)": no such variable
    while executing
"myeval $env($File)"
    (procedure "chooseRelevantFiles" line 39)
    invoked from within
"chooseRelevantFiles $::GlobalVars::reqStage"
(file "/vobs/tavor/src/Scripts/ReproduceBug.tcl" line 575)
如何避免此错误并继续执行我的脚本?

如果出现此错误,您可以对其进行处理(例如,记录以备以后使用,或使用回退值),然后继续执行脚本

e、 g


您可以使用
info exists
进行测试,如果未设置环境变量,则使用默认值,例如

if {[info exists env($File)]} {
    set filename $env($File)
} else {
    set filename /some/default/path
}
myeval $filename

要检查数组元素(如global env array)的可用性,请不要使用
[info exists$env(VAR)]
。 相反,您应该使用:

if { [ array names env VAR ] != "" } {
     puts "\nVAR exists and its value is $env(VAR)\n"
}

+1一般来说,我喜欢避免检查系统中是否存在某些东西,因为竞争条件,但在这种情况下,这可能是适当的,我喜欢
upvar 0::env($stuff)myvar;如果{[info exists myvar]}{…
习惯用法稍微好一点。但这完全取决于个人品味。@jk:捕捉错误比避免错误慢得多-Tcl的错误处理故意不是超快的-但是
::env
是一种特例,无论你做什么都很慢(因为它是进程全局状态,可以在Tcl的控制之外更改)。为什么?为什么不简单地
info exists env(VAR)
?为什么glob与数组名匹配?
if { [ array names env VAR ] != "" } {
     puts "\nVAR exists and its value is $env(VAR)\n"
}