如何处理低级 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
,或实施任何其他错误处理逻辑。
使用我的 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
,或实施任何其他错误处理逻辑。