If statement 下面的tcl代码将做什么?
我有以下几行:If statement 下面的tcl代码将做什么?,if-statement,try-catch,tcl,If Statement,Try Catch,Tcl,我有以下几行: if {[catch {exec fgrep E- $log_file} errors]} { set errors "" } 这有什么用 catch命令是否将日志文件中fgrep找到的所有行放入错误中 它是否只会出现由fgrep引发的错误,例如,如果文件不存在 如果,什么时候取,什么时候不取 是的,你说得对。如果命令exec fgrep E-$log_file返回任何错误,将捕获这些错误,并将为变量errors分配错误消息。在这种情况下,捕获的是exec命令的结果。
if {[catch {exec fgrep E- $log_file} errors]} {
set errors ""
}
这有什么用
命令是否将日志文件中catch
找到的所有行放入fgrep
错误中
- 它是否只会出现由
引发的错误,例如,如果文件不存在fgrep
- 如果,什么时候取
,什么时候不取
是的,你说得对。如果命令
exec fgrep E-$log_file
返回任何错误,将捕获这些错误,并将为变量errors
分配错误消息。在这种情况下,捕获的是exec
命令的结果。查看,您可以看到exec如何返回错误的特殊性。您的代码示例立即覆盖了错误
变量。我应该补充一点,errors
对变量名的选择有点误导-results
会更好,因为无论是否发生错误,都会设置变量
因此,如果
catch
发现错误,将采用if
。我无法就fgrep找不到文件的问题发表评论。我不清楚这是错误还是正常情况。让我们从内到外解构您的代码
exec fgrep E- $log_file
这将针对名称存储在变量log\u文件中的文件运行fgrep E-
。如果exec
有语法问题(谢天谢地,没有),如果fgrep
程序有语法问题(在我看来是可以的),如果$log\u文件不存在,或者如果没有匹配项,它会产生Tcl错误。如果没有错误,它将返回grepping、warts和all的输出
catch {exec fgrep E- $log_file} errors
这将在捕获错误的环境中运行上面的代码,并返回是否发生错误(形式上,没有错误时返回0,有错误时返回1,其他代码用于其他不太常见的异常返回类型,在这种情况下不会发生)。如果没有发生错误,exec
的正常结果存储在errors
变量中,如果有错误,错误消息存储在errors
中。请注意,可以通过全局errorCode
变量来区分错误类型,但您不需要这样做(而且通常不需要这样做)
这将使用上面的catch
的结果作为布尔值:如果发生错误,它将计算主体(将errors
变量设置为空字符串),否则它不做任何额外的操作
总结
总的来说,您的代码将错误设置为日志文件中以换行符分隔的行,否则将错误设置为空字符串。+1回答非常好。我更喜欢更明确地处理——返回值严格来说不是布尔值,而是状态代码:如果{[catch{…}errors]!=0}{…
if {[catch {exec fgrep E- $log_file} errors]} {
set errors ""
}