2011-10-10 8 views
8

Trong mã của tôi Tôi đang sử dụng các biến môi trường, nhưng nếu nó (env.var) không tồn tại, tôi nhận được thông báo lỗi NAME_ENV_VAR: không có biến đó, và kịch bản của tôi ngừng thực thi. Ví dụ, trong dòngLàm cách nào để tránh lỗi: Không có biến môi trường như vậy?

myeval $env($File) 

tôi nhận được một lỗi:

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) 

Làm thế nào tôi có thể tránh được lỗi này và tiếp tục thực hiện kịch bản của tôi không?

Trả lời

6

catch lỗi thì bạn có thể làm điều gì đó với nó (ví dụ đăng nhập nó cho sau này, hoặc sử dụng một mùa thu lại giá trị) và điền đầy đủ kịch bản của bạn

ví dụ

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

Bạn có thể thử nghiệm với info exists và sử dụng mặc định nếu biến môi trường không được đặt, ví dụ:

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

+1 Nói chung tôi thích để tránh kiểm tra nếu một cái gì đó trong hệ thống tồn tại vì điều kiện chủng tộc, nhưng trong trường hợp này nó có lẽ là thích hợp –

+1

Tôi thích 'upvar 0 :: env ($ thứ) myvar; nếu {[info tồn tại myvar]} {... 'thành ngữ hơi tốt hơn. Nhưng tất cả phụ thuộc vào sở thích cá nhân. – kostix

+0

@jk .: Bắt lỗi là chậm hơn nhiều so với tránh nó - xử lý lỗi của Tcl là _purposefully_ không phải siêu nhanh - nhưng ':: env' là một trường hợp đặc biệt làm chậm bất cứ điều gì bạn làm (vì đó là trạng thái toàn cầu quá trình có thể được thay đổi ngoài tầm kiểm soát của Tcl). –

3

Để kiểm tra phần tử mảng như mảng env toàn cầu, không sử dụng [info exists $env(VAR)]. Thay vào đó, bạn nên sử dụng:

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

Tại sao? Tại sao không đơn giản là 'thông tin tồn tại env (VAR)'? Tại sao glob phù hợp với tên mảng? –