在命名空间内的 proc 中的 return 语句后打开文件?

Opening files after return statement in a proc inside a namespace?

我无法打开文件并从命名空间内的过程中写入文件。只是想知道 TCL 是否允许这样做。

namespace eval ::ms {}
proc ::ms::add {a b} {
   return [expr {$a + $b}]
   set fp [open "dummy.txt" w+]
   puts $fp "test\ntest1\ntest2"
   close $fp
} 
puts [::ms::add 10 20]

我希望在执行这段代码后,一个名为 dummy.txt 的文件出现在我的当前目录中。

当过程执行 return(没有您未提供的选项)时,它会立即停止执行过程。程序中随后出现的代码根本不会执行。要创建文件,请将创建它的命令移动到 return.

之前将内容写入其中
proc ::ms::add {a b} {
   set fp [open "dummy.txt" w+]
   puts $fp "test\ntest1\ntest2"
   close $fp

   # You should also brace your expressions always
   return [expr {$a + $b}]
} 

但是有一种方法可以让文件在 return 之后写入代码。返回是通过抛出一种异常在内部完成的(通常被过程的外壳捕获,这是准备和清理堆栈帧的相同代码位),可以被拦截。 Tcl 有两个命令可以拦截return 异常:catchtry。后者使得将代码放在 return 之后很容易:

proc ::ms::add {a b} {
    try {
        return [expr {$a + $b}]
    } finally {
        set fp [open "dummy.txt" w+]
        puts $fp "test\ntest1\ntest2"
        close $fp
    }
} 

可以 catch 做同样的事情(这更像是一种原始操作),但它很繁琐,并不真正推荐。