使用我的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
在stderr上。在某个地方可能存在丢失Close()
的错误,但这是而不是我的问题。
我想知道的是,是否有一种简单的方法可以在程序中捕获这些或类似的错误? 我只知道这个错误,因为它被记录了。 具体来说:如何访问底层监听器的错误? ListenAndServe()
不会返回错误。是否有其他方法可以获得这些错误的通知?ListenAndServe()
不会从底层侦听器返回错误(至少不是所有错误)。
(编辑)的
答案 0 :(得分:2)
net / http将所有错误记录到server.ErrorLog。您可以使用它来拦截日志消息,但是您可以以编程方式从这些日志中提取多少数据并不明显。
答案 1 :(得分:1)
如果您查看(*http.Server).Serve()
的实施方式here,很明显您可以定义自己的实现net.Listener
的类并将其提供给Serve()
函数而不是使用ListenAndServe()
,它将默认侦听器放在那里。在错误中使panic
出现错误,然后在代码中出现recover
,或者实现任何其他错误处理逻辑。