TCL/TK:避免有关删除不存在的文件的错误消息



在我的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}
}]

文档:捕获,陈,文件,球,如果,打开,放置,设置,尝试

最新更新