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

Go 中 for 循环中的错误处理可能会导致下一次迭代

Go 中 for 循环中的错误处理可能会导致下一次迭代

Go
猛跑小猪 2022-05-23 16:46:21
我为将日志文件发送到不同位置的特定 Go 实现而苦苦挣扎:package mainfunc isDestinationSIEM(json_msg string, json_obj *jason.Object, siem_keys []string) (bool) {    if json_obj != nil {        dest, err := json_obj.GetString("destination")        if err == nil {            if strings.Contains(dest,"SIEM") {                return true            }        }        for _, key :=  range siem_keys {            if strings.Contains(json_msg, key) {                return true            }        }    }    return false}func sendToSIEM(siem_dst string, json_msg string) (error) {    // Create connection to syslog server    roots := x509.NewCertPool()    ok := roots.AppendCertsFromPEM([]byte(rootPEM))    if !ok {        fmt.Println("failed to parse root certificate")    }    config := &tls.Config{RootCAs: roots, InsecureSkipVerify: true}    conn, err := tls.Dial("tcp", siem_dst, config)    if err != nil {        fmt.Println("Error connecting SIEM")        fmt.Println(err.Error())    } else {        // Send log message        _, err = fmt.Fprintf(conn, json_msg)        if err != nil {            fmt.Println("Error sending SIEM message: ", json_msg)            fmt.Println(err.Error())        }    }    defer conn.Close()    return err}func main() {    // simplified code otherwise there would have been too much    // but the 'devil' is this for loop    for _, obj := range objects {        // first check        isSIEM := isDestinationSIEM(obj, siem_keys)        if isSIEM {           err := sendToSIEM(obj)           if err != nil {             // print error           }        isAUDIT:= isDestinationSIEM(obj)        if isAUDIT {           err := sendToAUDIT(obj)           if err != nil {             // print error           }    } // end of for}当“if isSIEM”返回错误时,不进行第二次检查“if isAUDIT”。为什么是这样?如果返回错误,循环是否从下一次迭代开始?错误看起来像这样:运行时错误:无效的内存地址或 nil 指针取消引用:errorString(列出了几个 go 包)
查看完整描述

1 回答

?
暮色呼如

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

错误看起来像这样:运行时错误:无效的内存地址或 nil 指针取消引用:errorString(列出了几个 go 包)

这意味着你抓住了panic()并且你的程序已经停止,这意味着你的圈子for也停止了。

这里详细介绍了恐慌https://blog.golang.org/defer-panic-and-recover的工作原理


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

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