Heim > Artikel > Backend-Entwicklung > Ist es in Ordnung, innerhalb einer Verzögerungsfunktion in Panik zu geraten, insbesondere wenn bereits Panik vorliegt?
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.
func sub(){ defer func (){ panic(2) }() panic(1) } func main(){ defer func(){ x:=recover() println(x.(int)); }() sub() }
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.)
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.
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) }
Ausgabe (versuchen Sie es auf Go Playground):
c2e572c1c34a0369ef7989373914f540Auch 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) }()
Ausgabe (versuchen Sie es auf Go Playground):
Checkpoint 2 Checkpoint 1 panic: 999 [recovered] panic: 2 [recovered] panic: 1 ...
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!