新闻中心

Golang grpc服务如何处理error返回_Golang grpc error状态码与映射

2025-11-30
浏览次数:
返回列表
正确处理gRPC错误需使用status.Error返回状态码,如InvalidArgument表示参数错误,NotFound表示资源不存在,并在客户端用status.FromError解析,确保错误语义清晰。

golang grpc服务如何处理error返回_golang grpc error状态码与映射

在 Golang 的 gRPC 服务开发中,正确处理错误并返回合适的错误状态码,是保证客户端能准确理解服务端异常情况的关键。gRPC 使用 status 包来定义标准的错误码,并通过 google.golang.org/grpc/status 提供操作接口。

gRPC 标准错误码(gRPC Status Code)

gRPC 定义了一组跨语言通用的状态码,位于 codes.Code 枚举中。常用的包括:

  • OK:操作成功(一般不用于错误)
  • InvalidArgument:请求参数错误(如字段校验失败)
  • NotFound:请求资源不存在
  • AlreadyExists:资源已存在(如重复创建)
  • PermissionDenied:权限不足
  • Unauthenticated:未认证(身份验证失败)
  • FailedPrecondition:前置条件不满足
  • Un*ailable:服务暂时不可用
  • Internal:内部错误(如 panic、未预期的异常)
  • Unimplemented:方法未实现

在服务端返回错误

使用 status.Errorf 构造带有状态码和消息的错误,然后直接返回。gRPC 框架会自动将其序列化并通过 wire 传输。

func (s *UserService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.User, error) { if req.Id == "" { return nil, status.Error(codes.InvalidArgument, "user ID is required") } user, err := s.db.FindUser(req.Id) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, status.Error(codes.NotFound, "user not found") } // 其他数据库错误视为内部错误 return nil, status.Error(codes.Internal, "internal error") } return &pb.User{Name: user.Name}, nil }

客户端解析错误

客户端收到响应错误时,应使用 status.FromError 来提取状态码和消息。

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: "123"}) if err != nil { st, ok := status.FromError(err) if !ok { log.Println("非 gRPC 错误:", err) return } switch st.Code() { case codes.NotFound: log.Println("用户不存在:", st.Message()) case codes.InvalidArgument: log.Println("参数错误:", st.Message()) default: log.Printf("未知错误: %v", st.Message()) } return } // 成功处理 resp

自定义错误映射(可选)

若业务中使用了自定义错误类型,可通过中间件或封装函数统一映射为 gRPC 状态码。例如:

func errorToStatus(err error) error { switch { case errors.Is(err, ErrUserNotFound): return status.Error(codes.NotFound, err.Error()) case errors.Is(err, ErrInvalidInput): return status.Error(codes.InvalidArgument, err.Error()) case errors.Is(err, ErrUnauthorized): return status.Error(codes.Unauthenticated, err.Error()) default: // 非预期错误标记为 Internal log.Printf("internal error: %v", err) return status.Error(codes.Internal, "internal error") } }

这样可以在业务逻辑中使用清晰的错误类型,最后统一转换为 gRPC 兼容的错误格式。

基本上就这些。关键是用好 status.Errorstatus.FromError,并根据语义选择合适的状态码,避免所有错误都返回 Internal 或 InvalidArgument。规范的错误处理能让 API 更易用、更健壮。

以上就是Golang grpc服务如何处理error返回_Golang grpc error状态码与映射的详细内容,更多请关注其它相关文章!


# 错误码  # 外贸推广网站降权了么  # 光明seo推广多少钱  # 钻石网站建设文案策划  # 营销传单推广策略  # 潍坊网站建设专业  # 株洲学校网站建设  # 面馆推广营销策划  # 哈尔滨抖音seo要求  # 马鞍山医院网站建设  # 服装seo软文收录  # 相关文章  # 将其  # 并在  # go  # 正确处理  # 服务端  # 自定义  # 如何处理  # 客户端  # 不存在  # red  # 状态码  # google  # switch  # ai  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  J*aScript数据结构转换:将对象数组按类别分组  在Runstone环境中高效处理TasteDive API的JSON数据  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  J*aScript中正确使用querySelectorAll与复杂CSS选择器  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  poki免费入口快捷访问 poki人气小游戏直接玩站点  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  J*aScript中针对特定容器内图片动画的实现教程  限制HTML日期输入框的日期选择范围  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Go语言中JSON数据解析与字段访问教程  C++ map遍历方法大全_C++ map迭代器使用总结  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  VS Code远程开发时如何处理文件权限问题  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  c++如何实现单例设计模式_c++线程安全的单例模式写法  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  痛风发作了怎么办? 快速止痛和后期饮食调理  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  C#中解析不规范的HTML为XML 常见的坑与解决办法  解决J*aScript中重复选择项的确认对话框显示问题  支付宝如何设置安全保护_支付宝安全设置的全面教程  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  J*aScript中安全有效地处理localStorage字符串数据  BetterDiscord插件中安全更新用户简介的实践指南  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  yandex入口引擎手机版 yandex安卓版下载入口  知音漫客正版漫画平台_知音漫客官网账号登录  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  J*aScript设计模式实践_j*ascript代码优化  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法 

搜索