tcl/tk:避免关于删除不存在的文件的错误消息

tcl/tk:避免关于删除不存在的文件的错误消息,tcl,Tcl,在我的Tcl/Tk脚本中,有一个步骤可以删除一些txt文件。 我使用: 但如果文件不存在,则会出现错误消息,这将阻止脚本的使用。 我想做的是删除文件,如果它存在,如果它不存在,跳过错误。 有什么好办法吗 好的,我找到了答案:file exists filename适用于这种情况 您可以使用 file delete file1.txt 其中您可以使用 file delete file1.txt 其中如何避免错误停止程序 “第0个”解决方案是使用不会引发错误的命令。例如glob-nocompla

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

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

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

您可以使用

file delete file1.txt
其中

您可以使用

file delete file1.txt

其中

如何避免错误停止程序

“第0个”解决方案是使用不会引发错误的命令。例如
glob-nocomplain
,而不仅仅是
glob
,或者在本例中,如timrau所建议的
文件删除file1.txt

在某些情况下,不可能防止出现错误。在这些情况下,您可以从几种策略中进行选择。假设您需要调用
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}
}]

文档:,,,

如何避免错误停止程序

“第0个”解决方案是使用不会引发错误的命令。例如
glob-nocomplain
,而不仅仅是
glob
,或者在本例中,如timrau所建议的
文件删除file1.txt

在某些情况下,不可能防止出现错误。在这些情况下,您可以从几种策略中进行选择。假设您需要调用
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}
}]

文档:,,,

实际上,在删除之前最好不要使用
文件存在
进行检查;文件可以在检查完成和删除之间创建或消失。(这是一个基本的竞争条件。)最好处理错误(或者不要像
文件删除
那样首先抛出错误)。实际上,最好不要在删除前使用
文件存在
进行检查;文件可以在检查完成和删除之间创建或消失。(这是一个基本的竞争条件。)最好处理错误(或者不要像
file delete
那样首先抛出错误)。