Обработка ошибок в пределах для l oop in Go приводит, вероятно, к следующей итерации - PullRequest
0 голосов
/ 28 марта 2020

Я борюсь с определенной реализацией c Go для отправки файлов журнала в разные места:

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


}

Когда 'if isSIEM' возвращает ошибку, вторая проверка 'if isAUDIT' - это не проводится. Почему это? Если возвращается ошибка, l oop начинается со следующей итерации?

Ошибка выглядит следующим образом: ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя: errorString (в котором перечисляется пара go пакеты)

1 Ответ

1 голос
/ 28 марта 2020

Ошибка выглядит следующим образом: ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя: errorString (в котором перечислены несколько go пакетов)

Это означает, что вы перехватываете panic() и ваша программа была остановлена, что означает, что ваш круг for также остановлен.

Здесь подробно описано, как работает с pani c https://blog.golang.org/defer-panic-and-recover

...