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 ""
    }