我最近一直在嘗試 gRPC 錯誤處理,并希望將我自己的 proto 消息傳遞給客戶端(定義我自己的錯誤詳細信息和內部錯誤代碼)。在搜索之后,發現了幾個使用 gRPC 狀態包中的 WithDetails() 來附加自定義元數據的示例。我開始實施如下gRPC 原型消息message ErrorInfo { int64 error_code = 1; string error_message = 2; string resource_name = 3;}服務器端實現// Frame the error message st := status.New(codes.NotFound, "object not found") errInfo := &api.ErrorInfo { ErrorCode: 100, ErrorMessage: "Fetching credential failed", ResourceName: req.GetBackupLocation().GetCloudCredential(), } var err error st, err = st.WithDetails(errInfo) if err != nil { // If this errored, it will always error // here, so better panic so we can figure // out why than have this silently passing. panic(fmt.Sprintf("Unexpected error attaching metadata: %v", err)) } return st.Err()客戶端實現fmt.Printf("line 76 err :%v", err) st := status.Convert(err) for _, detail := range st.Details() { switch t := detail.(type) { case *api.ErrorInfo: fmt.Printf("error code: %v", t.GetErrorCode()) fmt.Printf("error msg: %v", t.GetErrorMessage()) fmt.Printf("resource name: %v", t.GetResourceName()) } }當我運行代碼時,它命中了在服務器代碼中添加的 Panic(),這意味著 WithDetails() 出錯了。為了進一步進行,消除了服務器端的恐慌,此客戶端引發以下錯誤:any: message type "" isn't linked inerror問題:WithDetails() 是否僅適用于 googleapis/rpc/errdetails 標準 gRPC 原型定義而不適用于自定義原型?查看 proto 文件和代碼實現,我沒有看到任何特定于 gRPC errdetails 包的內容。當我嘗試使用此包中的 proto 消息時,它工作正常。[注意:我使用的是gogo protobuf]任何人都可以告訴我我在這里缺少什么嗎?
1 回答

浮云間
TA貢獻1829條經驗 獲得超4個贊
我遇到了類似的錯誤(any: message type "" isn't linked in *errors.errorString
)。就我而言,這是由于grpc.Status
API。
如果您使用的是 gogo proto,則需要導入/使用
"github.com/gogo/status"
代替
"google.golang.org/grpc/status"
- 1 回答
- 0 關注
- 266 瀏覽
添加回答
舉報
0/150
提交
取消