【问题标题】:Error handling of the lines where regex doesn't match while reading a file读取文件时正则表达式不匹配的行的错误处理
【发布时间】:2021-05-16 20:22:05
【问题描述】:

我正在尝试读取日志文件并匹配每行中的一些字符串。现在,如果该行没有任何匹配的字符串,则程序会因res == 0 的长度而退出并在之后停止读取行。即使正则表达式之间不匹配,我也希望程序继续读取下一行。

func analyzeLog(s string) (*time.Time, bool) {

    res := regexp.MustCompile(LogLineRegex).FindAllStringSubmatch(s, 1)

    if len(res) == 0 {
        panic("Not Matching")
    }

    timeString := res[0][1]
    description := res[0][2]

    t, err := time.Parse(TimeFormat, timeString)
    check(err)

    return &t, strings.HasPrefix(description, ErrorTerm)
}
func readLogFile(offset int64) (*ErrorMetrics, int64, error) {

...
...
...

    for {
        line, _, err := r.ReadLine()
        if err == io.EOF {
            break
        } else if err != nil {
            panic(err)
        }

        t, hasError := analyzeLog(string(line))

        if hasError {
            em.Count += 1
        }
    }

...
...
...
}

什么是前进的好方法?

【问题讨论】:

    标签: regex go


    【解决方案1】:

    不要恐慌(),你的程序不会退出。 例如,您可以使用 log.Println(err) 并从那里更准确地处理您何时想要记录以及何时想要 panic()。

    “ panic 内置函数会停止当前 goroutine 的正常执行。当函数 F 调用 panic 时,F 的正常执行会立即停止。任何被 F 延迟执行的函数都以通常的方式运行,然后 F 返回给它的调用者。对于调用者 G,调用 F 的行为就像调用 panic,终止 G 的执行并运行任何延迟函数。这将一直持续到正在执行的 goroutine 中的所有函数都以相反的顺序停止。此时,程序以非零退出代码终止。这种终止序列称为恐慌,可以通过内置函数恢复来控制​​。”

    您也可以从错误中恢复,但这意味着您必须恢复并从下一行开始读取日志,我认为这不是您想要的。你只需要在你不想恐慌的情况下使用 panic()。在无法进一步执行的情况下使用恐慌。

    希望这会有所帮助。

    【讨论】:

    • 你想让程序在哪里恐慌?当 res == 0 并且它仍然退出时,我尝试了恐慌。另外,我不想为下一行重新读取文件。
    • 在 for 循环中,您有 panic(),它正在杀死您的循环并退出程序。如果你没有找到比赛,为什么要恐慌?如果需要,只需记录此事件,不要惊慌。仅当您的软件无法进一步运行时才会出现恐慌。
    【解决方案2】:

    如果返回的数组长度为零,我已返回 nil 值。现在,函数如下所示。

    func analyzeLog(s string) (*time.Time, bool) {
    
        res := regexp.MustCompile(LogLineRegex).FindAllStringSubmatch(s, 1)
    
        if len(res) == 0 {
            return nil, false
        }
    
        timeString := res[0][1]
        description := res[0][2]
    
        t, err := time.Parse(TimeFormat, timeString)
        check(err)
    
        return &t, strings.HasPrefix(description, ErrorTerm)
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多