WorkoutBuddy
WorkoutBuddy

Reputation: 759

Error Handling within a for loop in Go results probably in a next iteration

I struggle with a specific Go implementation for sending log files to different locations:

package main

func 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


}

When the 'if isSIEM' returns an error, the second check 'if isAUDIT' is not conducted. Why is this? If an error is returned, does the loop start with the next iteration?

The error looks like this: runtime error: invalid memory address or nil pointer dereference: errorString (which lists a couple of go packages)

Upvotes: 0

Views: 3833

Answers (1)

Maxim
Maxim

Reputation: 2391

The error looks like this: runtime error: invalid memory address or nil pointer dereference: errorString (which lists a couple of go packages)

It means you catch the panic() and your program has been stopped that means your circle for is stopped too.

Here details how works with panic https://blog.golang.org/defer-panic-and-recover

Upvotes: 1

Related Questions