TCL打开文件并检查错误

TCL打开文件并检查错误,tcl,Tcl,我正在为语音网关内的Cisco TCL/IVR编程TCL 我有一些带有公共假日日期的文本文件,需要在主服务器上打开。如果打开文件时返回错误,我想尝试使用辅助备份服务器 代码: 我试图使用Read标志;如果它是1,则我将在文件内搜索。如果是0,那是因为该文件无法在任何服务器上打开,因此我只会将该呼叫视为工作日(非假日) 但是,在我当前的代码中,当第一次尝试打开文件失败时,它会自动停止执行脚本 在第一个错误之后,我如何继续执行?我是否应该创建一个过程并返回类似-1的值?如果是这样,我该怎么做?命令e

我正在为语音网关内的Cisco TCL/IVR编程TCL

我有一些带有公共假日日期的文本文件,需要在主服务器上打开。如果打开文件时返回错误,我想尝试使用辅助备份服务器

代码:

我试图使用
Read
标志;如果它是
1
,则我将在文件内搜索。如果是
0
,那是因为该文件无法在任何服务器上打开,因此我只会将该呼叫视为工作日(非假日)

但是,在我当前的代码中,当第一次尝试打开文件失败时,它会自动停止执行脚本


在第一个错误之后,我如何继续执行?我是否应该创建一个过程并返回类似
-1
的值?如果是这样,我该怎么做?

命令
error
退出脚本(这意味着一旦到达
error
,可以说执行停止)。如果
通过
stderr
或更合适的频道将错误消息放入
中,可能会更好:

puts stderr "Unable to open the file: $filename on Primary Server \n $errmsg"

我会像你想的那样做

proc openFils { filename httpsvr2 textfile ) {

    set fd -1
    foreach f $filename $httpsvr2$textfile {

        if { ! [file exists $f] } {
             puts stderr "File $f not on system"
        }

        if [catch {set fd [open $f] } errmsg] {
             puts stderr "Unable to open the file: $f \n $errmsg"
        } else {
             break
        }
    }

   return $fd
}

现在您可以对文件句柄“fd”执行操作,注意:上面的脚本将打开并返回它可以打开的第一个文件,而不是两个文件。

另外。。。使用
[file exists which filename]
检查文件是否显式存在可能比直接打开文件并在出现故障时处理故障更为整洁。最后,将条件放在大括号内的
{…}
语句中通常是好的做法;如果执行
语句,则将推迟评估;如前所述,当第一次遇到if语句时,将对该条件进行计算。最后一次可能没什么区别,但我的头开始痛了,因为我想知道它是否会痛。@nurdglaw说得很好。我可能也应该指出它们。我会在以后有时间的时候编辑这些文件。我正在考虑更多的问题,我想在尝试打开文件时可能会有其他错误,我不知道。。。比如访问权。尽管如此,OP应该知道会捕捉到什么样的错误,所以我不会把它放在答案中,但OP总是可以使用
文件存在
,尤其是当他阅读你的评论时。
proc openFils { filename httpsvr2 textfile ) {

    set fd -1
    foreach f $filename $httpsvr2$textfile {

        if { ! [file exists $f] } {
             puts stderr "File $f not on system"
        }

        if [catch {set fd [open $f] } errmsg] {
             puts stderr "Unable to open the file: $f \n $errmsg"
        } else {
             break
        }
    }

   return $fd
}