[Golang] Fehler, die nicht behandelt werden können / Sudo Null IT News

Es kommt vor, dass wir dem Dienst neue Funktionen hinzufügen möchten, und wir möchten dies immer schnell tun. Und manchmal kommt die Idee, eine funktionierende Version zu schreiben und dann Fehler zu beheben. Es mag den Anschein haben, dass wir, wenn wir neue Funktionen entwickeln, die vorhandene Funktionalität nicht beeinflussen können – unser http- oder grpc-Framework fängt alle Paniken ab und verarbeitet sie. Dies ist jedoch nicht immer der Fall, und in diesem Artikel möchte ich auf einige Fehler eingehen, die Sie immer genau beobachten sollten, da sie zu einem Dienstabsturz führen können.

Panik in Goroutine

Wenn wir eine Goroutine im Handler verwenden, die aus irgendeinem Grund eine Panik verursacht hat, kann Golang diese Panik nicht verarbeiten und die Anwendung stürzt mit einem Fehler ab und alle Anfragen, die der Dienst gerade verarbeitet, werden beendet.

Wenn Sie so etwas wie diesen Code schreiben

type User struct { Email string } func UpsertUser(r *http.Request) (User, error) { return User{}, nil } func SendEmail(u User) { panic(“Senden von E-Mails ist nicht implementiert”) } func CreateUser( w http.ResponseWriter, r *http.Request) { user, err := UpsertUser(r) if err != nil { // Verarbeitungsfehler } go func() { SendEmail(user) // kann etwas anderes sein }() }

Wenn dann die CreateUser-Funktion aufgerufen wird, fällt der Dienst aus.

Um dies zu beheben, müssen Sie in jeder Goroutine mit Panik umgehen

func CreateUser(w http.ResponseWriter, r *http.Request) { user, err := UpsertUser(r) if err != nil { // Behandlungsfehler } go func() { defer func() { if err := recovery (); err != nil { log.Printf(“Panik behoben: %v”, err) } }() SendEmail(user) // kann etwas anderes sein }() }

und die App wird nicht abstürzen und alle werden glücklich sein.

Unendliche Rekursion

Wenn wir aus irgendeinem Grund Rekursion verwenden, müssen wir sicherstellen, dass es für keine Eingabeparameter eine unendliche Rekursion gibt, da es unmöglich ist, einen Stapelüberlauf in Golang (unendliche Rekursion führt zu einem Stapelüberlauf) und der Anwendung zu behandeln stürzt ab.

Angenommen, wir haben die folgende Implementierung zur Berechnung der Fibonacci-Zahl geschrieben:

func Fib(n int64) int64 { if n == 1 { return 1 } return Fib(n-1) + Fib(n-2) }

Und wenn wir einen Funktionsaufruf in unserem Code haben Flunkerei Bei einer negativen Zahl stürzt die Anwendung mit einem Fehler ab schwerwiegender Fehler: Stapelüberlauf.

Dies mag Leute überraschen, die in Skriptsprachen wie Ruby oder Python geschrieben haben und anfangen, in Golang zu schreiben. Da es in Skriptsprachen recht einfach ist, eine Ausnahme abzufangen, die anzeigt, dass der Stack seinen Maximalwert erreicht hat:

def fib(n): if n == 1: return 1 return fib(n- 1) + fib(n – 2) try: fib(0) außer RecursionError as e: print(e)

Der obige Python-Code wird einfach auf der Konsole ausgegeben maximale Rekursionstiefe im Vergleich überschritten und die Anwendung wird weiter ausgeführt.

Arbeiten mit unsicheren

Beim Arbeiten mit dem Modul unsicher Es ist ziemlich einfach, die App zum Absturz zu bringen. Daher sollten Sie dieses Modul nur verwenden, wenn alles sorgfältig geprüft und getestet wurde.

Angenommen, wir entscheiden uns, den String nicht zu kopieren, sondern ihn in ein Byte-Slice zu konvertieren und die folgende Funktion zu schreiben:

func ToSlice(ein String) []Byte {Rückgabe *(*[]byte)(unsicher. Zeiger(&a)) }

Jetzt können wir die Zeile ändern:

a := Zeichenkette([]byte(“Andrey Berenda”)) b := ToSlice(a) b[5] = ‘i’ fmt.Println(a) // Andrej Berenda

Wenn Sie jedoch versehentlich eine Zeichenfolge übergeben, die in der Kompilierungsphase bekannt ist, und versuchen, sie zu ändern, tritt ein Fehler auf, der zu einem Serverstopp führt

a := “Andrey Berenda” b := ToSlice(a) b[5] = ‘i’ fmt.Println(a) // schwerwiegender Fehler: Fehler

Fazit

In diesem Artikel habe ich einige der Fehler analysiert, die recht einfach auf den Server gelegt werden können. Es gibt immer noch viele solcher Fehler in Golang, daher sollten Sie versuchen, Ihren Code mit Tests abzudecken, die die Funktionalität des Codes überprüfen, da Golang ziemlich gute Tools zum Schreiben von Tests hat.

Similar Posts

Leave a Reply

Your email address will not be published.