go実行時にpanic(nil)
が検出され、エラーが報告されます。遅延関数でパニック(nil)と通常の実行を検出する方法Go?
しかし、nil
を返すので、私はdefer
赤関数でrecover()
とpanic(nil)
を検出できないので、私はゼロであることが ためrecover()
の戻り値をテストすることになるように私は通常の実行(NOパニック)と区別することができません。
例えば、
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は単なる一例であり、私は重要な例はたくさんのクリーンアップを必要とすることができますと思います。まあ、これらのクリーンアップコードは実際のプログラムのクラッシュでも実行されませんが、私は可能な限り防御したいと思います。
遅延関数のパラメータに関係なく、どのようにパニックを検出することができますか?
ああ、不明な質問がありましたら申し訳ありません。私が望んでいたのは、 'パニック(無)'と '遅延関数'での通常の実行を区別することでした... – Eonil
多分、関数を終了する前にフラグを設定することができます。 – Eonil
インスピレーションをありがとう!私はフラグを設定することでこれを解決しました。 – Eonil