如何处理低级 net/http 错误?

How to handle low-level net/http errors?

使用我的 golang net/http 服务器,我偶尔会遇到类似

的错误

2017/08/04 15:06:25 http: Accept error: accept tcp 127.0.0.1:80: accept4: too many open files; retrying in 1s

在标准错误上。某处可能存在缺少 Close() 的错误,但这 不是 我的问题。

我想知道是否有一种简单的方法可以在 go 中以编程方式捕获这些或类似错误? 我只知道这个错误,因为它已被记录。 ListenAndServe() 不会 return 错误。有没有其他方法可以收到此类错误的通知? 具体来说:我如何访问底层侦听器的错误? ListenAndServe() 不会 return 来自底层侦听器的错误(至少不是所有错误)。

(已编辑)

net/http 将所有错误记录到 server.ErrorLog。您可以使用它来拦截日志消息,但您无法通过编程从这些日志中提取多少数据。

如果您查看 (*http.Server).Serve() 的实现方式 here,很明显您可以定义自己的 class 来实现 net.Listener 并将其提供给Serve() 函数,而不是使用 ListenAndServe(),它将默认侦听器放在那里。使其在出错时 panic,然后在您的代码中因恐慌而 recover,或实施任何其他错误处理逻辑。