2014-09-18 124 views
2

我看到了很多的代碼做這樣的事情:在什麼情況下會http.ListenAndServe返回

log.Fatal(http.ListenAndServe(":8080",nil)) 

我從來沒有見過HTTP服務器返回的錯誤,但我想更多的瞭解可能性我可以遇到什麼類型的故障場景。

如果我的處理程序代碼發生混亂,它會停止嗎?它只會在最初無法綁定的情況下返回嗎?

確保服務器保持最高活動狀態的最佳做法是什麼?

回答

3

如果我的處理程序代碼發生混亂,它會停止嗎?

否內置的http服務器從panics中恢復並記錄它們。

它只會在最初無法綁定的情況下返回嗎?

這是通常的原因,儘管可能有其他錯誤可能會強制偵聽器關閉。

確保服務器保持最高活動狀態的最佳做法是什麼?

如果http服務器的主循環退出,這可能是一個致命錯誤,您不想嘗試恢復。如果嘗試綁定地址時返回該呼叫,則可以檢查address in use錯誤,然後等待並重試。

// Example to show the error types and fields on a *nix system. 
// You should check the validity of these assertions if you don't want to 
// panic. Due to the fact that this reaches into syscall, it's probably 
// not much better than checking the string for "address already in use" 

if err.(*net.OpError).Err.(*os.SyscallError).Err == syscall.EADDRINUSE { 
    fmt.Println("Address in use") 
} 

請記住ListenAndServe實際上是2個呼叫,您可以自己分開。它會創建一個net.Listener,然後將其提供給http.ServerServe(l net.Listener)方法。

0

這可能是值得指出的是,去package documentationlog.Fatal

致命相當於打印(),然後到os.Exit(1)的調用。

另外,對於documentationhttp.ListenAndServe解釋

這個函數將阻塞,直到節目結束。

所以log.Fatal調用只有在HTTP監聽器由於某種原因而被終止時纔會被調用。

恐慌將被處理,正如上面的答案所述。

http.ListenAndServe函數應該無限期地持續下去,直到基礎套接字連接中斷。此時,log.Fatal將打印由偵聽程序返回的任何消息,然後調用程序完全退出並顯示錯誤代碼(1)。

所以保持偵聽器活着的「最佳實踐」是做任何事情來保持套接字連接的活躍。在那個階段,它更可能成爲網絡考慮因素。

相關問題