ソケット接続を開くと、ソケットを開いた直後に socket.Close() ロジックを defer 関数に入れます。しかし、socket.Close() が別のパニックを引き起こすとしたら? プログラムのクラッシュを防ぐために、常に別の defer/recover を外側の defer 内にネストする必要がありますか? このようなもの: http://play.golang.org/p/GnEMQS-0jj
ありがとう、エルグ
ソケット接続を開くと、ソケットを開いた直後に socket.Close() ロジックを defer 関数に入れます。しかし、socket.Close() が別のパニックを引き起こすとしたら? プログラムのクラッシュを防ぐために、常に別の defer/recover を外側の defer 内にネストする必要がありますか? このようなもの: http://play.golang.org/p/GnEMQS-0jj
ありがとう、エルグ
通常、パニックについてあまり心配する必要はありません。通常、これらは 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
延期された関数は、周囲の関数が戻る直前に、延期されたのとは逆の順序で実行されます。