【发布时间】:2025-12-01 16:30:01
【问题描述】:
我正在尝试在 Go gRPC 客户端代码中检测 gRPC 服务器关闭,例如
import (
pb "mysample.com/api/rpc"
"google.golang.org/grpc"
)
var stream pb.SearchProductService_MarketStreamClient
for {
r, err := stream.Recv()
if err == io.EOF {
log.Println("Info: server close")
break
} else if err != nil {
log.Println("Err: grpc code:", grpc.Code(err))
if err != nil {
log.Fatal(err)
}
}
outs := printOrderbook(r)
fmt.Println(outs)
if outf != nil {
outf.WriteString(time.Now().Format("030405.000 ") +
outs + "\n")
}
}
输出消息是
mysample.go:122: Err: grpc code: Unavailable
panic: rpc error: code = Unavailable desc = transport is closing
我正在尝试在 Go 的源代码和 $GOPATH/src/ 中搜索“传输正在关闭”,但我找不到这样的短语。有没有什么聪明的方法来处理这种更深层次的错误?
【问题讨论】:
-
check() 是做什么的?如果它没有恐慌,那么您可能正在从已终止的流中读取。也许不完全是您正在寻找的东西,但我有类似的代码,一旦观察到错误就会终止循环。
-
我只想在服务器在流中间关闭时漂亮地关闭客户端程序。我只需要过滤掉已知错误,显示未知错误