Maison  >  Article  >  développement back-end  >  Comment éviter les crashs inattendus dans Golang

Comment éviter les crashs inattendus dans Golang

尚
original
2020-03-27 14:44:223963parcourir

Comment éviter les crashs inattendus dans Golang

Qu'il s'agisse d'un crash de panique déclenché par la couche d'exécution en raison d'une erreur d'exécution de code, ou d'un crash de panique déclenché activement, le report et la récupération peuvent être utilisés pour implémenter la capture et la récupération des erreurs, afin que le code puisse planter après son apparition. Ensuite, laissez-le continuer à s'exécuter.

Go n'a pas de système d'exception. Son utilisation de la panique pour déclencher des temps d'arrêt est similaire à la levée d'exceptions dans d'autres langages, donc le mécanisme de récupération des temps d'arrêt de recovery correspond au mécanisme try/catch.

Laisser le programme continuer à s'exécuter lorsqu'il plante

Le code suivant implémente la fonction ProtectRun(), qui passe une fonction anonyme ou une fonction d'exécution après une fermeture, Lorsque la fonction entrante panique sous quelque forme que ce soit, l'erreur du crash peut être imprimée, tout en permettant au code suivant de continuer à s'exécuter sans provoquer le crash de l'ensemble du processus.

Fonction d'exécution protégée :

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("运行后")
}

Explication du code :

La ligne 9 déclare une structure décrivant l'erreur, et ses membres enregistrent la fonction d'exécution de l'erreur.

La ligne 17 utilise defer pour retarder l'exécution de la fermeture Lorsque la panique déclenche un crash, la fonction ProtectRun() cessera de s'exécuter et la fermeture après le report sera appelée.

Ligne 20, recovery() obtient les paramètres transmis par panique.

Ligne 22, utilisez switch pour effectuer une assertion de type sur la variable err.

Ligne 23, si l'erreur est une erreur d'exécution générée par la couche d'exécution, telle qu'un accès à un pointeur nul, une division par 0, etc., imprimez l'erreur d'exécution.

Ligne 25, autres erreurs, imprime les données d'erreur transmises.

À la ligne 44, utilisez panic pour déclencher manuellement une erreur et transmettre une structure avec des informations. À ce moment, recovery obtiendra les informations sur la structure et les imprimera.

La ligne 57 simule l'erreur causée par l'affectation d'un pointeur nul dans le code. À ce moment, l'erreur sera renvoyée par la couche d'exécution et capturée par la fonction recovery() de la fonction ProtectRun().

La relation entre panique et récupération

La combinaison de panique et de report présente les caractéristiques suivantes :

S'il y a panique mais pas de récupération, le le programme va planter.

Il y a panique et récupération de la capture, donc le programme ne plantera pas. Après avoir exécuté le report correspondant, quittez la fonction actuelle du point de crash et poursuivez l'exécution.

Pour plus de connaissances sur Golang, veuillez faire attention à la colonne Tutoriel Golang sur le site Web PHP chinois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn