使用自定义错误码拦截grpc内部状态码问题

 更新时间:2023年09月18日 10:45:19   作者:love666666shen  
这篇文章主要介绍了使用自定义错误码拦截grpc内部状态码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用自定义错误码拦截grpc内部状态码

在golang项目中,通过grpc开发时,对于非法传入的参数、解析失败、返回异常时,虽然使用的是自定义的状态码,如果不做特殊处理,grpc默认会使用其内部的状态码进行拦截。

如果想要使用自定义的错误码,应该如何处理呢?

这里提供一种方式可以自由使用自定义的状态码,虽然不能从全局拦截grpc状态码,但也能够做到简洁方便地处理自定义状态码,具体只需在返回error之前,通过status.Errorf()传入自定义错误码和错误信息描述即可。

import (
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)
err = status.Errorf(codes.Code(resp.ErrNum),  errcode.GetCodeDesc(int(resp.ErrNum)))

其中,resp表示返回结构,ErrNum表示错误码,GetCodeDesc函数通过错误码返回对应的错误信息描述。

status.Errorf函数定义如下:

// A Code is an unsigned 32-bit error code as defined in the gRPC spec.
type Code uint32
// Errorf returns Error(c, fmt.Sprintf(format, a...)).
func Errorf(c codes.Code, format string, a ...interface{}) error {
	return Error(c, fmt.Sprintf(format, a...))
}

grpc成功和异常状态码

所在包:

package io.grpc;

所在类:

Status 
    public static final Status OK;
    public static final Status CANCELLED;
    public static final Status UNKNOWN;
    public static final Status INVALID_ARGUMENT;
    public static final Status DEADLINE_EXCEEDED;
    public static final Status NOT_FOUND;
    public static final Status ALREADY_EXISTS;
    public static final Status PERMISSION_DENIED;
    public static final Status UNAUTHENTICATED;
    public static final Status RESOURCE_EXHAUSTED;
    public static final Status FAILED_PRECONDITION;
    public static final Status ABORTED;
    public static final Status OUT_OF_RANGE;
    public static final Status UNIMPLEMENTED;
    public static final Status INTERNAL;
    public static final Status UNAVAILABLE;
    public static final Status DATA_LOSS;
  • Ok:返回成功
  • Canceled:操作已取消
  • Unknown:未知错误。如果从另一个地址空间接收到的状态值属 于在该地址空间中未知的错误空间,则可以返回此错误的示例。 没有返回足够的错误信息的API引发的错误也可能会转换为此错误
  • InvalidArgument:表示客户端指定了无效的参数。 请注意,这与FailedPrecondition不同。 它表示无论系统状态如何(例如格式错误的文件名)都有问题的参数
  • DeadlineExceeded:意味着操作在完成之前过期。 对于更改系统状态的操作,即使操作成功完成,也可能会返回此错误。 例如,服务器的成功响应可能会延迟足够的时间以使截止日期到期
  • NotFound:表示找不到某个请求的实体(例如文件或目录)
  • AlreadyExists:表示尝试创建实体失败,因为已经存在
  • PermissionDenied:表示调用者没有执行指定操作的权限。它不能用于因耗尽某些资源而引起的拒绝(使用ResourceExhausted代替这些错误)。如果调用者无法识别,则不能使用它(使用Unauthenticated代替这些错误)
  • ResourceExhausted:表示某些资源已耗尽,可能是每个用户的配额,或者整个文件系统空间不足
  • FailedPrecondition:表示操作被拒绝,因为系统不处于操作执行所需的状态。
  • Aborted:表示操作被中止,通常是由于并发问题(如序列器检查失败,事务异常终止等)造成的。请参阅上面的试金石测试以确定FailedPrecondition,Aborted和Unavailable之间的差异
  • OutOfRange:表示操作尝试超过有效范围。
  • Unimplemented:该方法未实现
  • Internal: 意味着底层系统预期的一些不变量已被打破。 如果你看到其中的一个错误,那么事情就会非常糟糕
  • Unavailable:内部Grpc服务不可用,请求不到
  • DataLoss:指示不可恢复的数据丢失或损坏
  • Unauthenticated:表示请求没有有效的操作认证凭证

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Go使用Pipeline实现一个简洁而高效的数据处理流水线

    Go使用Pipeline实现一个简洁而高效的数据处理流水线

    在并发编程中,流水线Pipeline是一种常见的设计模式,它将一个复杂任务拆解为多个独立步骤,由多个协程并行处理并通过通道传递数据,Go语言天生支持这种模型,能显著提高数据处理的性能和可读性,本文将给大家介绍如何使用Go实现一个简洁而高效的数据处理流水线
    2025-08-08
  • golang1.21新特性全面讲解

    golang1.21新特性全面讲解

    经过了半年左右的开发,golang 1.21 最近正式发布了,这个版本中有不少重要的新特性和变更,尤其是在泛型相关的代码上,下面小编就来和大家好好唠唠吧
    2023-08-08
  • Golang使用原生http实现中间件的代码详解

    Golang使用原生http实现中间件的代码详解

    中间件(middleware):常被用来做认证校验、审计等,家常用的Iris、Gin等web框架,都包含了中间件逻辑,但有时我们引入该框架显得较为繁重,本文将介绍通过golang原生http来实现中间件操作,需要的朋友可以参考下
    2024-05-05
  • 简单四步快速集成go环境变量

    简单四步快速集成go环境变量

    这篇文章主要为大家介绍了快速集成go环境变量的简单四个步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结

    如果你是一个开发人员,或多或少对树型结构都有一定的认识。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。本文为大家总结了一些二叉树必会知识点,需要的可以参考一下
    2022-08-08
  • Go语言递归函数的具体实现

    Go语言递归函数的具体实现

    本文主要介绍了Go语言递归函数的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 详解Go语言中切片的长度与容量的区别

    详解Go语言中切片的长度与容量的区别

    切片可以看成是数组的引用,切片的长度是它所包含的元素个数。切片的容量是从它的第一个元素到其底层数组元素末尾的个数。本文将通过示例详细讲讲Go语言中切片的长度与容量的区别,需要的可以参考一下
    2022-11-11
  • Go依赖注入DI工具wire使用详解(golang常用库包)

    Go依赖注入DI工具wire使用详解(golang常用库包)

    依赖注入是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入,本文结合示例代码给大家介绍Go依赖注入DI工具wire使用,感兴趣的朋友一起看看吧
    2022-04-04
  • 解决vscode中golang插件依赖安装失败问题

    解决vscode中golang插件依赖安装失败问题

    这篇文章主要介绍了解决vscode中golang插件依赖安装失败问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Go语言提升开发效率的语法糖技巧分享

    Go语言提升开发效率的语法糖技巧分享

    每门语言都有自己的语法糖,像java的语法糖就有方法变长参数、拆箱与装箱、枚举、for-each等等,Go语言也不例外。本文就来介绍一些Go语言的语法糖,需要的可以参考一下
    2022-07-07

最新评论