名称
return - 从进程中返回或者返回一个值语法
return ?result?return ?-code code? ?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特殊处理。它们是:
返回代码处理机制
返回代码使用Tcl去控制程序流,一个Tcl脚本就是一系列的Tcl命令,所以命令返回TCL_OK,运行会继续进行到脚本的下一个命令,如果异常返回代码不是TCL_OK,那么就会中断继续进行到脚本下一个命令的动作,脚本会终止,并且把返回的异常信息作为返回值返回,如果出现了break、continue和return就会导致脚本没有执行完所有的命令就直接返回了。一些Tcl的内建命令会对这些异常进行特殊处理,例如,在循环中, while、for和foreach这三个命令在循环体重运行命令,如果在循环体中出现了返回代码为TCL_BREAK或TCL_CONTINUE,循环命令将会重新执行,就相当于一个break或continue命令在循环中的作用。
示例
一个简单的例子,在一个过程中使用return命令来中断过程体:proc printOneLine {} {
puts "line 1" ;#这行将会打印
return
puts "line 2" ;#这行不会打印
}
使用return来返回值:
proc returnX {} {return X}
puts [returnX] ;#打印"X"
使用return -code error来汇报错误变元:
proc factorial {n} {
if {![string is integer $n] || ($n < 0)} {
return -code error /
"expected non-negative integer,/
but got /"$n/""
}
if {$n < 2} {
return 1
}
set m [expr {$n - 1}]
set code [catch {factorial $m} factor]
if {$code != 0} {
return -code $code $factor
}
set product [expr {$n * $factor}]
if {$product < 0} {
return -code error /
"overflow computing factorial of $n"
}
return $product
}
代替break命令:
proc myBreak {} {
return -code break
}
使用-level 0可选项,返回自己本身,可以替代break命令:
interp alias {} Break {} return -level 0 -code break
使用catch命令来捕获return -options返回的错误:
proc doSomething {} {
set resource [allocate]
catch {
# Long script of operations
# that might raise an error
} result options
deallocate $resource
return -options $options $result
}
使用return可选项来创建一个过程替代return命令本身:
proc myReturn {args} {
set result ""
if {[llength $args] % 2} {
set result [lindex $args end]
set args [lrange $args 0 end-1]
}
set options [dict merge {-level 1} $args]
dict incr options -level
return -options $options $result
}
本文详细介绍了TCL中的return命令及其各种用法,包括如何使用return命令中断过程执行、返回值、处理错误参数等。此外还介绍了return命令在TCL脚本中的异常返回代码机制以及如何通过return-code命令进行错误处理。

1838

被折叠的 条评论
为什么被折叠?



