接下来继续沿用前面的代码,来讲解如何运用错误处理。 假如我们需要在订单添加处理中处理非法 ID 请求。 如果我们传了一个不合法的 ID 如 -1,需要返回错误给客户端消费者。
func(s*server)AddOrder(ctxcontext.Context,orderReq*pb.Order)(*wrappers.StringValue,error){iforderReq.Id=="-1"{log.Printf("Order ID is vaild : %s",orderReq.Id)errorStatus:=status.New(codes.InvalidArgument,"Order ID is not valid")ds,err:=errorStatus.WithDetails(&epb.BadRequest_FieldViolation{Field:"ID",description=fmt.Sprintf("Order ID received is not valid %s : %s",orderReq.Id,orderReq.Description),},)iferr!=nil{returnnil,errorStatus.Err()}returnnil,ds.Err()}orderMap[orderReq.Id]=*orderReqlog.Println("Order : ",orderReq.Id," -> Added")return&wrapper.StringValue{Value:"Order Added: "+orderReq.Id},nil}
通过 status 包可以很方便的创建所需的错误码和相应错误详情。使用 Google API 的相应包可以设置更丰富的错误详情。