Heim > Backend-Entwicklung > Golang > Ist es in Ordnung, innerhalb einer Verzögerungsfunktion in Panik zu geraten, insbesondere wenn bereits Panik vorliegt?

Ist es in Ordnung, innerhalb einer Verzögerungsfunktion in Panik zu geraten, insbesondere wenn bereits Panik vorliegt?

WBOY
Freigeben: 2024-02-11 20:33:08
nach vorne
1002 Leute haben es durchsucht

在 defer 函数内部发生恐慌是否可以,特别是当它已经发生恐慌时?

Wird es irgendwelche Auswirkungen haben, wenn innerhalb der Verzögerungsfunktion eine Panik auftritt? Dies ist eine häufige Frage, insbesondere wenn eine Paniksituation eingetreten ist. In PHP wird die Defer-Funktion verwendet, um einige Bereinigungsvorgänge durchzuführen, bevor die aktuelle Funktion zurückkehrt. Wenn eine Panik auftritt, stoppt das Programm die Ausführung sofort und alle Verzögerungsfunktionen werden in der Reihenfolge „Last-in-first-out“ ausgeführt. Daher wird die Verzögerungsfunktion auch nach Auftreten einer Panik weiterhin ausgeführt. Dies ist nützlich für die Bearbeitung von Aufgaben wie Ressourcenfreigabe und Fehlerbehandlung. Egal was passiert, die Verzögerungsfunktion wird immer zuverlässig ausgeführt und gewährleistet so die Integrität und Stabilität des Codes.

Frageninhalt

func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}
Nach dem Login kopieren

Ich habe diesen Code ausprobiert und es scheint, dass die erste Panik panic(1) 被第二个恐慌 panic(2) „überschreibt“.

Aber ist es in Ordnung, das zu tun? Oder eine Golang-Funktion aufrufen, die innerhalb einer Verzögerungsfunktion in Panik geraten könnte?

(In C++ ist das Auslösen einer Ausnahme von einem Destruktor fast inakzeptabel. Wenn der Stapel abgewickelt wurde, wird das Programm beendet. Ich frage mich, ob es in Golang schlecht wäre, auf ähnliche Weise in Panik zu geraten.)

Gelöste Methode

Ja , Es ist okay. Die durch die Verzögerungsfunktion verursachte Panik ist kein wirklich neuer Sonderzustand, sie bedeutet lediglich, dass die Paniksequenz nicht gestoppt wird.

Ihr Beispielcode beweist auch, dass es in Ordnung ist, sogar panic() 称为可以通过对 recover()s „oberer“ Aufruf, die Verzögerungsfunktion zu stoppen.

Normen: Umgang mit Panik:

Eine Sache, die hier zu beachten ist, ist, dass auch wenn Sie den panic(),所有其他延迟函数仍然会运行。另外,来自延迟函数的没有 recover()panic() 宁愿“包装”现有的恐慌,而不是“覆盖”它(尽管 recover() 调用确实只会返回传递给最后一次 panic()-Aufruf innerhalb einer verzögerten Funktion aufrufen).

Sehen Sie sich dieses Beispiel an:

func main() {
    defer func() {
        fmt.Println("Checkpoint 1")
        panic(1)
    }()
    defer func() {
        fmt.Println("Checkpoint 2")
        panic(2)
    }()
    panic(999)
}
Nach dem Login kopieren

Ausgabe (versuchen Sie es auf Go Playground):

c2e572c1c34a0369ef7​989373914f540

Auch wenn alle verzögerten Funktionen aufgerufen werden panic(),所有延迟函数都会执行,并且打印的最终恐慌序列包含传递给所有 panic() der Wert des Aufrufs.

Wenn Sie recover() innerhalb einer Verzögerungsfunktion aufrufen, erhalten Sie im endgültigen Ausdruck auch diesen „wiederhergestellten“ Status oder diese Meldung:

defer func() {
    recover()
    fmt.Println("Checkpoint 1")
    panic(1)
}()
defer func() {
    recover()
    fmt.Println("Checkpoint 2")
    panic(2)
}()
Nach dem Login kopieren

Ausgabe (versuchen Sie es auf Go Playground):

Checkpoint 2
Checkpoint 1
panic: 999 [recovered]
    panic: 2 [recovered]
    panic: 1
...
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonIst es in Ordnung, innerhalb einer Verzögerungsfunktion in Panik zu geraten, insbesondere wenn bereits Panik vorliegt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
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