So verhindern Sie unerwartete Abstürze in Golang

Freigeben: 2020-03-27 14:44:22
Original
4030 Leute haben es durchsucht

So verhindern Sie unerwartete Abstürze in Golang

Ganz gleich, ob es sich um einen Panikabsturz handelt, der von der Laufzeitschicht aufgrund eines Codeausführungsfehlers ausgelöst wird, oder um einen aktiv ausgelösten Panikabsturz, Verzögerung und Wiederherstellung können zur Implementierung der Fehlererfassung und -wiederherstellung verwendet werden. Damit der Code nach dem Auftreten abstürzen kann, lassen Sie ihn dann weiterlaufen.

Go verfügt über kein Ausnahmesystem. Die Verwendung von Panic zum Auslösen von Ausfallzeiten ähnelt dem Auslösen von Ausnahmen in anderen Sprachen, sodass der Wiederherstellungsmechanismus nach Ausfallzeiten dem Try/Catch-Mechanismus entspricht.

Lassen Sie das Programm weiter ausführen, wenn es abstürzt

Der folgende Code implementiert die ProtectRun()-Funktion, die nach einem Abschluss eine anonyme Funktion oder eine Ausführungsfunktion übergibt. Wenn die eingehende Funktion in irgendeiner Form in Panik gerät, kann der Fehler des Absturzes ausgegeben werden, während der nachfolgende Code weiter ausgeführt werden kann, ohne dass der gesamte Prozess abstürzt.

Geschützte Ausführungsfunktion:

package main
 
import (
"fmt"
"runtime"
)
 
// 崩溃时需要传递的上下文信息
type panicContext struct {
function string // 所在函数
}
 
// 保护方式允许一个函数
func ProtectRun(entry func()) {
 
// 延迟处理的函数
defer func() {
 
// 发生宕机时,获取panic传递的上下文并打印
err := recover()
 
switch err.(type) {
case runtime.Error: // 运行时错误
fmt.Println("runtime error:", err)
default: // 非运行时错误
fmt.Println("error:", err)
}
 
}()
 
entry()
 
}
 
func main() {
fmt.Println("运行前")
 
// 允许一段手动触发的错误
ProtectRun(func() {
 
fmt.Println("手动宕机前")
 
// 使用panic传递上下文
panic(&panicContext{
"手动触发panic",
})
 
fmt.Println("手动宕机后")
})
 
// 故意造成空指针访问错误
ProtectRun(func() {
 
fmt.Println("赋值宕机前")
 
var a *int
*a = 1
 
fmt.Println("赋值宕机后")
})
 
fmt.Println("运行后")
}
Nach dem Login kopieren

Erklärung des Codes:

Zeile 9 deklariert eine Struktur, die den Fehler beschreibt, und ihre Mitglieder speichern die Ausführungsfunktion des Fehlers.

Zeile 17 verwendet „defer“, um die Ausführung des Abschlusses zu verzögern. Wenn eine Panik einen Absturz auslöst, wird die Ausführung der ProtectRun()-Funktion beendet und der Abschluss nach „defer“ wird aufgerufen.

Zeile 20, „recover()“ ruft die von Panic übergebenen Parameter ab.

Zeile 22, verwenden Sie den Schalter, um eine Typzusicherung für die Variable err durchzuführen.

Zeile 23: Wenn der Fehler ein von der Laufzeitschicht ausgelöster Laufzeitfehler ist, z. B. Nullzeigerzugriff, Division durch 0 usw., wird der Laufzeitfehler gedruckt.

Zeile 25, andere Fehler, gibt die übergebenen Fehlerdaten aus.

Verwenden Sie in Zeile 44 Panic, um manuell einen Fehler auszulösen und eine Struktur mit Informationen zu übergeben. Zu diesem Zeitpunkt ruft die Wiederherstellung die Strukturinformationen ab und druckt sie aus.

Zeile 57 simuliert den Fehler, der durch die Nullzeigerzuweisung im Code verursacht wird. Zu diesem Zeitpunkt wird der Fehler von der Laufzeitebene ausgelöst und von der Funktion „recover()“ der Funktion „ProtectRun()“ erfasst.

Die Beziehung zwischen Panik und Erholung

Die Kombination von Panik und Aufschub weist die folgenden Merkmale auf:

Wenn Panik, aber keine Erholung vorliegt, ist die Das Programm wird abstürzen.

Es gibt Panic und Recovery Capture, sodass das Programm nicht abstürzt. Nachdem Sie die entsprechende Verzögerung ausgeführt haben, beenden Sie die aktuelle Funktion am Absturzpunkt und fahren Sie mit der Ausführung fort.

Weitere Golang-Kenntnisse finden Sie in der Spalte Golang-Tutorial auf der chinesischen PHP-Website.

Das obige ist der detaillierte Inhalt vonSo verhindern Sie unerwartete Abstürze in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage