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!