为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
PIPIONE 2022-08-09 16:53:00
我正在尝试读取日志文件并匹配每行中的一些字符串。现在,如果行没有任何匹配的字符串,程序将退出并出现错误,因为 和 的长度之后停止读取行。我希望程序继续读取下一行,即使正则表达式在两者之间不匹配。res == 0func 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        }    }.........}什么是向前迈进的好方法?
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

不要惊慌(),你的程序不会退出。您可以使用日志。例如,Println(err)和从那里更精确地处理何时要记录以及何时要panic()。

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

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

希望这有帮助。


查看完整回答
反对 回复 2022-08-09
?
炎炎设计

TA贡献1808条经验 获得超4个赞

如果返回的数组长度为零,我返回了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)

}


查看完整回答
反对 回复 2022-08-09
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信