tcl/tk参考——控制结构return

名称

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特殊处理。它们是:

-errorcode list
只有当 -codeTCL_ERROR-errorcode可选项会被特殊对待,如果 list的值是关于错误的额外信息,就被当作Tcl列表进一步处理。当提供了 -code error 可选项但是没有 -errorcode可选项,那么 -errorcode的值将被默认设置为 NONE,这个可选项返回的值也会被存储在全局变量 errorCode中。
-errorinfo info
只有当 -codeTCL_ERROR-errorinfo可选项会被特殊对待, info是初始的堆栈,提供一个可读的额外信息来标示错误发生的位置,这个堆栈跟踪也会存储在全局变量 errorInfo中。当提供了 -code error可选项但是没有 -errorinfo可选项,Tcl将会把它自己初始的堆栈值来配置 -errorinfo
-level level
-level-code一起来配置返回代码, level值必须是一个非负整数,来指定在调用第几层的堆栈。如果没有提供 -level可选项,那么默认 level值为1。
-options options
options的值必须是有效字符,整个 options选项会作为一个额外的选选项返回。

返回代码处理机制

返回代码使用Tcl去控制程序流,一个Tcl脚本就是一系列的Tcl命令,所以命令返回 TCL_OK,运行会继续进行到脚本的下一个命令,如果异常返回代码不是 TCL_OK,那么就会中断继续进行到脚本下一个命令的动作,脚本会终止,并且把返回的异常信息作为返回值返回,如果出现了 breakcontinuereturn就会导致脚本没有执行完所有的命令就直接返回了。

一些Tcl的内建命令会对这些异常进行特殊处理,例如,在循环中, while、forforeach这三个命令在循环体重运行命令,如果在循环体中出现了返回代码为TCL_BREAKTCL_CONTINUE,循环命令将会重新执行,就相当于一个breakcontinue命令在循环中的作用。

示例

一个简单的例子,在一个过程中使用 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
}

你可能感兴趣的:(list,脚本,Integer,存储,merge,Tcl)