2013-12-10 11 views
7

ソケット接続を開くと、ソケットのオープン後にすぐにsocket.Close()ロジックを遅延関数に置きます。しかし、socket.Close()が別のパニックを引き起こすとしたらどうでしょうか?自分のプログラムがクラッシュするのを防ぐために、私はいつも外側の遅延の中に別の遅延/回復を入れなければならないでしょうか?このような何か:http://play.golang.org/p/GnEMQS-0jjゴランの安全な接続

おかげで、 のELG

+2

socket.Close()はパニックIIRCを引き起こすことはできません。 – fuz

+2

私は完全にはわかりません:閉じる(たとえば、net.TCPConnなど)はエラーになるかもしれませんが、パニックにはならないと思います。パニックが発生した場合、たとえばハードウェアの破損やメモリ不足のために、あなたのアプリはとにかく吹き飛ばされます。あなたの場合に応じて、返されたエラーを処理したいかもしれませんが、Closeでパニックを処理するのは少し編集的なようです。 – Volker

+0

@FUZxxlサーバからの接続を拒否するクライアントソケットを閉じるときに、パニックになります。ソケットがパニックに陥ることなく安全に閉じられるかどうかを知る方法はありますか?または、私はソケットクローズロジックのためだけにさらに1つのレベルの遅延をネストする必要があります。 –

答えて

7

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

他人が言ったように、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

繰延機能は、周囲の直前に実行されています関数は、それらが逆の順序で返されます。

関連する問題