2 回答
TA贡献1872条经验 获得超3个赞
如果我的处理程序代码恐慌,它会停止吗?
不会。内置的 http 服务器可以从恐慌中恢复并记录它们。
它只会在最初无法绑定的情况下返回吗?
这是通常的原因,尽管其他一些错误可能会迫使侦听器关闭。
确保服务器尽可能保持活动状态的最佳做法是什么?
如果 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 个调用,您可以自己将它们分开。它创建 a net.Listener,然后将其提供给 anhttp.Server的Serve(l net.Listener)方法。
TA贡献1828条经验 获得超4个赞
这可能是值得指出的是,去包文档的log.Fatal
说
Fatal 等价于 Print() 然后调用 os.Exit(1)。
此外,该文件的http.ListenAndServe
解释
此函数将阻塞,直到程序终止。
因此,log.Fatal
只有在 http 侦听器因某种原因被杀死时才会进行调用。
正如上面的答案所说,将处理恐慌。
该http.ListenAndServe
函数应该无限期地继续,直到底层套接字连接中断。此时log.Fatal
将打印侦听器返回的任何消息,然后调用程序以完全退出并显示错误代码 (1)。
因此,让侦听器保持活动状态的“最佳实践”是做任何使套接字连接保持活动状态的事情。在那个阶段,它更有可能是网络方面的考虑。
- 2 回答
- 0 关注
- 368 浏览
添加回答
举报