return - 從程序中返回或者返回乙個值return?
result?
return?-codecode? ?
result?
return?
option value ...? ?
result?
最簡單的用法,return命令在程式體內直接使用而不帶任何可選項,這樣將會使過程立刻返回。如果有
result變元,過程就返回
result的值,如果
result沒有指定就返回乙個空字串。
return命令可以在source命令中執行,當source執行乙個指令碼,return命令可以使指令碼的執行立刻停止,result將作為source的結果返回。
對於乙個過程的結果,可以通過return的-code可選項來返回額外的**,通常當-code不指定時過程正常返回,但是當-code使用時就產生乙個異常,
code可以是以下的值:
ok (or 0)一般返回:就像這個可選項被忽略掉的效果相同,過程的返回**為0(tcl_ok)。
error (1)錯誤返回:過程的返回**為1(tcl_error),返回的方式就像是命令error result相同。
return (2)過程返回**為2(tcl_return),返回的方式就像是命令return(沒有變元)。
break (3)過程返回**為3(tcl_break),返回的方式就像是命令break。
continue (4)過程返回**為4(tcl_continue),返回的方式就像是命令continue。
value
value必須是乙個整數,作為返回**返回。
當乙個過程想指出它接收到了乙個錯誤的變元,使用return -code error加上result去設定乙個合適的錯誤訊息,其它return -code的用法一般都是執行乙個新的控制結構。
return -code命令可以在source命令中執行,當source執行乙個指令碼,return -code命令可以使指令碼的執行立刻停止,return -code中的code將作為source的結果返回。
除了作為結果和返回**,在tcl中執行乙個命令也可以返回乙個可選項,一般的用法,所有的以下列出的option value都可以被catch命令捕獲到。
上文中所述的-code可選項會被tcl特殊處理,下面的其它的可選項也會被tcl特殊處理。它們是:
-errorcodelist
只有當-code為tcl_error時-errorcode可選項會被特殊對待,如果
list的值是關於錯誤的額外資訊,就被當作tcl列表進一步處理。當提供了-code error可選項但是沒有-errorcode可選項,那麼-errorcode的值將被預設設定為none,這個可選項返回的值也會被儲存在全域性變數errorcode中。
-errorinfoinfo
只有當-code為tcl_error時-errorinfo可選項會被特殊對待,
info是初始的堆疊,提供乙個可讀的額外資訊來標示錯誤發生的位置,這個堆疊跟蹤也會儲存在全域性變數errorinfo中。當提供了-code error可選項但是沒有-errorinfo可選項,tcl將會把它自己初始的堆疊值來配置-errorinfo。
-levellevel
-level和-code一起來配置返回**,
level值必須是乙個非負整數,來指定在呼叫第幾層的堆疊。如果沒有提供-level可選項,那麼預設
level值為1。
-optionsoptions
options的值必須是有效字元,整個options選項會作為乙個額外的選選項返回。
返回**使用tcl去控制程式流,乙個tcl指令碼就是一系列的tcl命令,所以命令返回tcl_ok,執行會繼續進行到指令碼的下乙個命令,如果異常返回**不是tcl_ok,那麼就會中斷繼續進行到指令碼下乙個命令的動作,指令碼會終止,並且把返回的異常資訊作為返回值返回,如果出現了break、continue和return就會導致指令碼沒有執行完所有的命令就直接返回了。
一些tcl的內建命令會對這些異常進行特殊處理,例如,在迴圈中,while、for和foreach這三個命令在迴圈體重執行命令,如果在迴圈體中出現了返回**為tcl_break或tcl_continue,迴圈命令將會重新執行,就相當於乙個break或continue命令在迴圈中的作用。
乙個簡單的例子,在乙個過程中使用return命令來中斷過程體:
proc printoneline {}使用return來返回值:
proc returnx {}使用return -code error來匯報錯誤變元:puts [returnx] ;#列印"x"
proc factorial代替break命令:if
set m [expr ]
set code [catch factor]
if
set product [expr ]
ifreturn$product
}
proc mybreak {}使用-level 0可選項,返回自己本身,可以替代break命令:
interp alias {} break {}return-level 0 -code break使用catch命令來捕獲return -options返回的錯誤:
proc dosomething {} result options使用return可選項來建立乙個過程替代return命令本身:deallocate $resourcereturn-options $options $result
}
proc myreturnset options [dict merge $args]
dict incr options -levelreturn-options $options $result
}
tcl tk參考 控制結構catch
catch 執行指令碼並捕獲錯誤 catchscript resultvarname?optionsvarname?catch命令用來防止出現錯誤而導致指令碼執行終止,catch命令可以呼叫tcl直譯器去執行指令碼,並且能夠正常返回。如果指令碼產生乙個錯誤,catch將返回乙個非0的整數,如果沒有捕...
tcl tk參考 控制結構update
update 處理掛起的事件和空閒 update?idletasks?這個命令用來給應用程式 更新 進入事件迴圈直到所有掛起的事件和空閒 都執行完畢。如果指定idletasks,就不處理新的事件或錯誤,只有空閒 被呼叫,這就導致操作被延遲了,就像顯示更新和視窗設計,會被立刻執行。當應用程式的狀態發生...
tcl tk參考 控制結構foreach
foreach 反覆迴圈操作乙個或多個列表的每個元素foreachvarname list body foreachvarlist1 list1 varlist2 list2 body foreach命令執行乙個迴圈,迴圈的變數是乙個或多個列表的元素。最簡單的情況下是乙個迴圈變數 varname和乙...