新闻中心
Golang grpc服务如何处理error返回_Golang grpc error状态码与映射
正确处理gRPC错误需使用status.Error返回状态码,如InvalidArgument表示参数错误,NotFound表示资源不存在,并在客户端用status.FromError解析,确保错误语义清晰。

在 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
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
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.Error 和 status.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运行时类型识别用法


2025-11-30
浏览次数:次
返回列表