为了账号安全,请及时绑定邮箱和手机立即绑定

在什么情况下 http.ListenAndServe 会返回

在什么情况下 http.ListenAndServe 会返回

Go
哆啦的时光机 2021-08-16 19:10:10
我看到很多代码都在做这种事情:log.Fatal(http.ListenAndServe(":8080",nil))我从未见过 http 服务器返回错误,但我想更多地了解我可能遇到的故障类型的可能性。如果我的处理程序代码恐慌,它会停止吗?它只会在最初无法绑定的情况下返回吗?确保服务器尽可能保持活动状态的最佳做法是什么?
查看完整描述

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)方法。


查看完整回答
反对 回复 2021-08-16
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这可能是值得指出的是,去包文档log.Fatal

Fatal 等价于 Print() 然后调用 os.Exit(1)。

此外,该文件http.ListenAndServe解释

此函数将阻塞,直到程序终止。

因此,log.Fatal只有在 http 侦听器因某种原因被杀死时才会进行调用。

正如上面的答案所说,将处理恐慌。

http.ListenAndServe函数应该无限期地继续,直到底层套接字连接中断。此时log.Fatal将打印侦听器返回的任何消息,然后调用程序以完全退出并显示错误代码 (1)。

因此,让侦听器保持活动状态的“最佳实践”是做任何使套接字连接保持活动状态的事情。在那个阶段,它更有可能是网络方面的考虑。


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 368 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信