读取文件时正则表达式不匹配的行的错误处理

我正在尝试读取日志文件并匹配每行中的一些字符串。现在,如果行没有任何匹配的字符串,程序将退出并出现错误,因为 和 的长度之后停止读取行。我希望程序继续读取下一行,即使正则表达式在两者之间不匹配。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

        }

    }


...

...

...

}

什么是向前迈进的好方法?


PIPIONE
浏览 143回答 2
2回答

当年话下

不要惊慌(),你的程序不会退出。您可以使用日志。例如,Println(err)和从那里更精确地处理何时要记录以及何时要panic()。“panic 内置函数会停止当前 goroutine 的正常执行。当函数 F 调用 panic 时,F 的正常执行会立即停止。任何执行由 F 延迟的函数都以通常的方式运行,然后 F 返回到其调用方。对于调用方 G,F 的调用就像调用 panic 一样,终止 G 的执行并运行任何延迟函数。这将一直持续到执行 goroutine 中的所有函数都以相反的顺序停止。此时,程序以非零退出代码终止。这种终止序列称为恐慌,可以通过内置函数恢复来控制。您也可以从错误中恢复,但这意味着您必须恢复并开始从下一行读取日志,我认为这不是您想要的。你只是在你不想恐慌的上下文中使用panic()。在无法进一步执行的情况下使用 panic。希望这有帮助。

炎炎设计

如果返回的数组长度为零,我返回了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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go