英文:
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
这些错误会在stderr中显示。可能是由于某个地方缺少了Close()
导致的bug,但这不是我的问题所在。
我想知道的是,在go语言中是否有一种简单的方法来以编程方式捕获这些或类似的错误?<strike>我之所以知道这个错误是因为它被记录下来了。ListenAndServe()
函数不会返回错误。是否有其他方法可以通知我这些错误?</strike>具体来说:我如何访问底层监听器的错误?ListenAndServe()
函数不会返回底层监听器的错误(至少不是全部)。
(已编辑)
英文:
With my golang net/http server, I occasionally get errors like
2017/08/04 15:06:25 http: Accept error: accept tcp 127.0.0.1:80: accept4: too many open files; retrying in 1s
on stderr. There might be a bug with a missing Close()
somewhere, but this is not what my question is about.
What I would like to know is whether there is an easy way to catch these or similar errors programmatically in go? <strike>I only know about this error because it's logged. ListenAndServe()
does not return an error. Is there some other way to get notified of errors like these?</strike> Specifically: how do I access the errors of the underlying listener? ListenAndServe()
does not return errors from the underlying listener (at least not all of them).
(edited)
答案1
得分: 2
net/http将所有错误记录到server.ErrorLog。您可以使用它来拦截日志消息,但是从这些日志中以编程方式提取多少数据并不明显。
英文:
net/http logs all errors to server.ErrorLog. You can use that to intercept the log messages, but it is not obvious how much data you can pull from those logs programatically.
答案2
得分: 1
如果你查看(*http.Server).Serve()
的实现这里,你会发现你可以定义自己的类来实现net.Listener
,然后将其传递给Serve()
函数,而不是使用ListenAndServe()
,后者会在那里放置一个默认的监听器。在你的代码中,可以让它在出现错误时panic
,然后稍后通过recover
从该panic
中恢复,或者实现任何其他错误处理逻辑。
英文:
If you look at how (*http.Server).Serve()
is implemented here, it is clear that you can just define your own class that implements net.Listener
and give it to the Serve()
function, instead of using ListenAndServe()
, which puts a default listener there. Make it panic
on error and later recover
from that panic in your code, or implement any other error handling logic.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论