2011-10-10 90 views
8

在我的代碼中,我使用了環境變量,但是如果它(env.var)不存在,我會收到錯誤消息NAME_ENV_VAR:沒有這樣的變量,我的腳本停止執行。 例如,在該行如何避免錯誤:沒有這樣的環境變量?

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) 

我怎樣才能避免這種錯誤,並繼續執行我的腳本?

回答

6

catch的錯誤,那麼你可以用它做的東西(例如日誌以供日後,或使用回退值),並與你的腳本進行

例如

if {[catch {myeval $env($File)} result]} { 
    lappend log $result 
} 
#other stuff 
15

您可以用info exists測試和使用默認如果環境變量沒有設置,例如。

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

+1一般而言,我想避免檢查,如果事情存在於系統中,因爲比賽條件,但在這種情況下,它可能是適當的 –

+1

我喜歡'upvar 0 :: env($ stuff)myvar;如果{[info exists myvar]} {...'成語略勝一籌。但這一切都取決於個人的品味。 – kostix

+0

@jk .:捕捉錯誤比避免它慢得多--Tcl的錯誤處理是_purposefully_不是超快速的 - 但是':: env'是一個特殊的情況,無論你做什麼都很慢(因爲它是流程全局狀態,可以在Tcl的控制範圍之外改變)。 –

3

要檢查全局env數組等數組元素,請不要使用[info exists $env(VAR)]。 相反,你應該使用:

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

爲什麼?爲什麼不簡單'info exists env(VAR)'?爲什麼數組名稱的glob匹配? –

相關問題