在命名空间内的 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 异常:catch
和try
。后者使得将代码放在 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
做同样的事情(这更像是一种原始操作),但它很繁琐,并不真正推荐。
我无法打开文件并从命名空间内的过程中写入文件。只是想知道 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 异常:catch
和try
。后者使得将代码放在 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
做同样的事情(这更像是一种原始操作),但它很繁琐,并不真正推荐。