在我的Tcl/Tk脚本中,有一个步骤可以删除一些txt文件。我使用:
exec rm file1.txt
但是,如果文件剂量不存在,则会出现错误消息,这将阻止脚本的使用。我想做的是删除文件(如果存在),如果不存在,则跳过错误。有没有好方法可以做到这一点?
好的,我找到了答案:file exists filename
适用于这种情况。
你可以使用
file delete file1.txt
尝试删除不存在的文件不被视为错误。
如何避免错误停止程序。
"0th"解决方案是使用不会引发错误的命令。 例如glob -nocomplain
而不仅仅是glob
,或者在这种情况下file delete file1.txt
timrau 建议的。
在某些情况下,无法防止引发错误。在这些情况下,您可以从几种策略中进行选择。假设您需要调用 mycmd
,这可能会引发错误。
# Tcl 8.6
try mycmd on error {} {}
# Tcl 8.4 or later
catch mycmd
此调用会静默地截获错误,并让程序继续。如果错误不重要,这是完全可以接受的,例如,当您尝试丢弃可能不存在的变量(catch {unset myvar}
)。
当引发错误时,您可能希望采取一些操作,例如将其报告给自己(作为stderr
上的错误消息,或在消息框中,或在某种日志中)或通过以某种方式处理错误。
try mycmd on error msg {puts stderr "There was a problem: $msg"}
if {[catch mycmd msg]} {
puts stderr "There was a problem: $msg"
}
您可能希望仅在没有错误时才执行某些操作:
try {
mycmd
} on ok res {
puts "mycmd returned $res"
} on error msg {
puts stderr "There was a problem: $msg"
}
if {[catch mycmd res]} {
puts stderr "There was a problem: $res"
} else {
puts "mycmd returned $res"
}
例如,此调用返回文件的内容,如果文件不存在,则返回空字符串。它确保通道已关闭,并且在任一情况下都销毁了保存通道标识符的变量:
set txt [try {
open $filename
} on ok f {
chan read $f
} on error msg {
puts stderr $msg
} finally {
catch {chan close $f}
catch {unset f}
}]
文档:捕获,陈,文件,球,如果,打开,放置,设置,尝试