8

ソケット接続を開くと、ソケットを開いた直後に socket.Close() ロジックを defer 関数に入れます。しかし、socket.Close() が別のパニックを引き起こすとしたら? プログラムのクラッシュを防ぐために、常に別の defer/recover を外側の defer 内にネストする必要がありますか? このようなもの: http://play.golang.org/p/GnEMQS-0jj

ありがとう、エルグ

4

1 に答える 1

8

通常、パニックについてあまり心配する必要はありません。通常、これらは 2 つのクラスのエラーを表します。開発者のミス (nil 参照、範囲外の配列) と、おそらく対処できないシステム レベルのエラー (メモリ不足など) です。

他の人が言ったsocket.Closeように、パニックにならず、むしろエラーを返します。もしあなたがそうするなら:

defer socket.Close()

エラーは破棄され、他に何もする必要はありません。

しかし、パニックから回復したいと思ったとします。リカバリ ハンドラが最初に延期されている場合は、他に何もする必要はありません。

func main() {
  defer func() {
    if err := recover(); err != nil {
      fmt.Println(err)
    }
  }()
  defer panic("this will be recovered")
}

遅延関数は逆の順序で実行されます: http://golang.org/ref/spec#Defer_statements

延期された関数は、周囲の関数が戻る直前に、延期されたのとは逆の順序で実行されます。

于 2013-12-10T23:01:35.217 に答える