处理 Go 语言服务端在 Accept 时的临时错误
最近在看 gRPC 的源代码,看到了 gRPC 服务器在 net.Listener.Accept()
时的异常处理逻辑,发现我目前不管是在个人项目还是在公司级项目都没有处理 Accept 的错误,直接 panic 或退出循环了。
有点自惭形秽,是时候学习并改进一波代码了。
我直接把 gRPC 这段逻辑的代码贴出来吧(简化并去掉与本文章不相关的代码,并加上了注释):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
这段代码和我写的代码的最大不同就是增加了 Accept 出错可能是因为临时错误的处理逻辑,临时错误属于可能重试可能成功的错误,所以有必要在有限度的条件下进行重试。 这应该是编写更加稳健的程序的良好习惯。
可惜我用 C 写 Linux 的程序不多,还没有养成这个习惯。 而在 Windows 上,我记得是没有这个错误的,操作系统会自动处理因为中断程序的原因导致的重试。
参考文章: