【问题标题】:What will the following tcl code do?下面的 tcl 代码会做什么?
【发布时间】:2012-05-24 08:20:05
【问题描述】:

我有以下行:

if {[catch {exec fgrep E- $log_file} errors]} {
    set errors ""
}

这是做什么的?

  • catch 命令是否将日志文件中fgrep 找到的所有行放入errors
  • 它是否只会将fgrep 抛出的错误放在那里,例如如果文件不存在?
  • if 什么时候会被占用,什么时候不会被占用?

【问题讨论】:

    标签: if-statement try-catch tcl


    【解决方案1】:

    让我们从内到外解构您的代码。

    exec fgrep E- $log_file
    

    这将针对名称存储在变量log_file 中的文件运行fgrep E-。如果exec 存在句法问题(谢天谢地没有),fgrep 程序存在句法问题(我觉得没问题),如果$log_file 不存在,则会产生 Tcl 错误,或者如果没有匹配项。如果没有错误,它会返回 grepping、warts 等的输出。

    catch {exec fgrep E- $log_file} errors
    

    这会在捕获错误的环境中运行上面的代码,并返回是否发生错误(正式地,它在没有错误时返回 0,当有错误时返回 1,以及其他不太常见的类型的其他代码在这种情况下不会发生的特殊回报)。如果没有发生错误,exec 的正常结果将存储在errors 变量中,如果发生错误,则将错误消息存储在errors。请注意,可以通过全局 errorCode 变量区分错误类型,但您不必这样做(而且通常没有必要)。

    if {[catch {exec fgrep E- $log_file} errors]} {
        set errors ""
    }
    

    这使用上面catch 的结果作为布尔值:如果发生错误,它会评估主体(将errors 变量设置为空字符串),否则它什么都不做。

    总结

    总体而言,您的代码将errors 设置为log_file 文件中的换行符分隔行,否则将errors 设置为空字符串。

    【讨论】:

    • +1 出色的答案。我更喜欢更明确地处理the status returned by catch——返回值不是严格意义上的布尔值,它是一个状态码:if {[catch {...} errors] != 0} { ...
    【解决方案2】:

    是的,你是对的。如果命令exec fgrep E- $log_file 返回任何错误,它们将被捕获并且变量errors 将被分配错误消息。在这种情况下,捕获的是exec 命令的结果。查看manual,您可以看到 exec 如何返回错误的特殊性。您的代码示例会立即覆盖 errors 变量。我应该补充一点,errors 对变量名的选择有点误导 - results 会更好,因为无论是否发生错误都会设置变量。

    因此,如果catch 发现错误,将采用if。我无法评论有关 fgrep 找不到文件的问题。我不清楚这是错误还是正常情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2015-12-12
      • 2020-02-21
      • 1970-01-01
      相关资源
      最近更新 更多