Fange Panik in Go

Jay Singh 20 Juni 2023
  1. Fange Panik in Go
  2. Beheben Sie Paniken in Go
Fange Panik in Go

Panik tritt wie ein Fehler während der Laufzeit auf. Mit anderen Worten, eine Panik tritt auf, wenn in Ihrem Go-Programm ein unvorhergesehener Umstand auftritt, der dazu führt, dass die Ausführung beendet wird.

Wenn sich eine bestimmte Bedingung entwickelt, wie z. B. Array-Zugriffe außerhalb der Grenzen, kann während der Laufzeit eine Panik auftreten. Diese typischen Aktionen sind das Indizieren eines Arrays über seine Grenze hinaus, das Durchführen von Typtests, das Ausführen von Methoden auf Nullzeigern, das falsche Verwenden von Mutexes und der Versuch, mit geschlossenen Kanälen zu interagieren.

Die meisten dieser Szenarien entstehen durch Programmierfehler, die der Compiler beim Erstellen Ihrer Software nicht entdecken kann. Da Panics wichtige Informationen zur Behebung eines Problems liefern, verwenden Entwickler Panics häufig, um anzuzeigen, dass sie während der Entwicklung Fehler gemacht haben.

Schauen wir uns einige Beispiele an, um Panik in Golang zu fangen.

Fange Panik in Go

Das folgende Programm gibt den vollständigen Namen einer Person aus. Die Funktion fullName gibt den vollständigen Namen einer Person aus.

Diese Methode bestimmt, ob die Zeiger firstName und lastName null sind. Wenn es nil ist, ruft die Funktion Panik mit einer entsprechenden Meldung auf.

Beispiel 1:

package main

import (
    "fmt"
)

func fullName(firstName *string, lastName *string) {
    if firstName == nil {
        panic("runtime error: first name cannot be nil")
    }
    if lastName == nil {
        panic("runtime error: last name cannot be nil")
    }
    fmt.Printf("%s %s\n", *firstName, *lastName)
    fmt.Println("returned normally from fullName")
}

func main() {
    firstName := "Jay"
    fullName(&firstName, nil)
    fmt.Println("returned normally from main")
}

Ausgang:

panic: runtime error: last name cannot be nil

goroutine 1 [running]:
main.fullName(0x405058?, 0xc0000a2f70?)
    /tmp/sandbox3339134150/prog.go:12 +0x114
main.main()
    /tmp/sandbox3339134150/prog.go:20 +0x35

Der folgende Code zeigt, dass die Funktion employee von der Funktion main aufgerufen wird. Als Input übermitteln wir name und Alter des Mitarbeiters.

Wenn das Alter eines Mitarbeiters das Rentenalter überschreitet, geht die Mitarbeiterfunktion in den Panikmodus.

Beispiel 2:

package main

func employee(name *string, age int) {
    if age > 65 {
        panic("Age cannot be greater than retirement age")
    }
}
func main() {
    empName := "Jay"
    age := 73

    employee(&empName, age)
}

Ausgang:

panic: Age cannot be greater than retirement age

goroutine 1 [running]:
main.employee(...)
    /tmp/sandbox4109873090/prog.go:5
main.main()
    /tmp/sandbox4109873090/prog.go:12 +0x27
exit status 2

Beheben Sie Paniken in Go

Die Funktion Wiederherstellen verwendet den Wert des Fehlers, um festzustellen, ob eine Panik aufgetreten ist oder nicht. Da die Eingabe der Panikfunktion eine leere Schnittstelle ist, kann sie einen beliebigen Typ haben.

Jeder Schnittstellentyp, einschließlich der leeren Schnittstelle, hat einen Nullwert von nil. Wie in diesem Beispiel zu sehen ist, muss darauf geachtet werden, dass nil nicht als Eingabe für Panik verwendet wird.

Beispiel:

package main
import (
    "fmt"
    "log"
)
func main() {
    divideByZero()
    fmt.Println("Hey, we survived dividing by zero!")

}
func divideByZero() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("panic occurred:", err)
        }
    }()
    fmt.Println(divide(1, 0))
}
func divide(a, b int) int {
    if b == 0 {
        panic(nil)
    }
    return a / b
}

Ausgang:

Hey, we survived dividing by zero!