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