在我的Tcl / Tk脚本中,有一步可以删除一些txt文件。 我用:
exec rm file1.txt
但是如果该文件不存在,则会出现错误消息,这将阻止脚本使用。 我想要做的是删除文件,如果它存在,如果它不存在,跳过错误。 这样做有好办法吗?
好的,我找到了答案:file exists filename
适合这种情况。
答案 0 :(得分:5)
答案 1 :(得分:0)
如何避免错误停止您的程序。
" 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}
}]