15

Golang では、リカバリなしでパニックが発生するとプロセスがクラッシュするため、すべての関数の先頭に次のコード スニペットを配置することになります。

defer func() {
    if err := recover(); err != nil {
        fmt.Println(err)
    }
}()

プログラムがクラッシュするのを防ぐためだけに。今思うと、本当にその通りなのだろうか?同じコードをどこにでも置くのは少し奇妙に見えると思うからです。

メイン関数が例外/パニックを制御するためのより良い方法になるまで、Javaの方法で、呼び出し元の関数まで例外をバブリングするように思えます。Go の設計によるものだと理解していますが、Go のようにプロセスをすぐにクラッシュさせる利点は何ですか?

4

3 に答える 3

3

通常、例外があっても「FaultBarrier」でキャッチします。通常、すべての新しいスレッドが生成される場所です。ポイントは、予期しないエラーをキャッチしてログに記録することです。

Go では、予想されるすべての失敗に対して戻り値を使用します。あなたが作業しているフレームワークには、通常、セッション (つまり、通常は http トランザクション) をキャッチして問題をログに記録するためのフォールト バリアがあります。私が回復が起こっている唯一の他の場所は、冪等でない Close 関数のようなものです。何かがすでに閉じられているかどうかわからないが、それを閉じなければならないことがわかっている場合は、実行していることをすべて失敗させるのではなく、2 回目のクローズ パニックが無視されるように、リカバリを実行することになる可能性があります。 FaultBarrier までの道のり。

于 2016-08-28T14:56:38.167 に答える