Die Go Runtime kann panic(nil)
erkennen und meldet einen Fehler.Wie erkennt man Panik (Null) und normale Ausführung in der verzögerten Funktion?
Allerdings kann ich nicht panic(nil)
mit recover()
in einer defer
roten Funktion erkennen, weil es nil
zurück, so kann ich es nicht von den normalen Ausführung unterscheiden (keine Panik), wie ich für der Rückgabewert von recover()
testen würde Null sein .
Zum Beispiel
defer func(){
var err = recover()
if err != nil {
// Real serious situation. Panic from inner code.
// And we may have some critical resources which
// must be cleaned-up at any cases.
// However, this will not be executed for panic(nil)
rollback()
// I am still not sure that how should I treat `panic`…
// Should I just ignore them?
}
}()
var err = doTransaction()
if err == nil {
commit() // Happy case.
} else {
rollback() // Regular execution. Just a lucky case.
}
ROLLBACK ist nur ein Beispiel, und ich glaube, ich kann viel kritischen Fällen muss Bereinigungs haben. Nun, dieser Cleanup-Code wird auch bei einem echten Programmabsturz nicht ausgeführt, aber ich möchte so viel wie möglich verteidigen.
Wie kann ich eine Panik unabhängig von ihrem Parameter in einer verzögerten Funktion erkennen?
Ah Es tut mir leid für die unklare Frage. Was ich wollte, war die Unterscheidung von "panic (nil)" und normaler Ausführung in "defer'red" -Funktion ... – Eonil
Vielleicht kann ich einfach ein Flag setzen, bevor ich die Funktion verlasse. – Eonil
Danke für die Inspiration! Ich habe das gelöst, indem ich eine Flagge gesetzt habe. – Eonil