tcl / tk:避免关于删除非现有文件的错误消息

时间:2014-12-29 08:57:32

标签: tcl

在我的Tcl / Tk脚本中,有一步可以删除一些txt文件。 我用:

exec rm file1.txt

但是如果该文件不存在,则会出现错误消息,这将阻止脚本使用。 我想要做的是删除文件,如果它存在,如果它不存在,跳过错误。 这样做有好办法吗?

好的,我找到了答案:file exists filename适合这种情况。

2 个答案:

答案 0 :(得分:5)

您可以使用

file delete file1.txt

其中trying to delete a non-existent file is not considered an error.

答案 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}
}]

文档:catchchanfileglobifopenputs,{{3 },set