使用自定义错误码拦截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中的Channel以及死锁的造成

    浅谈GO中的Channel以及死锁的造成

    本文主要介绍了浅谈GO中的Channel以及死锁的造成,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Go语言构建流数据pipeline的示例详解

    Go语言构建流数据pipeline的示例详解

    Go的并发原语可以轻松构建流数据管道,从而高效利用 I/O 和多个 CPU, 本文展示了此类pipelines的示例,强调了操作失败时出现的细微之处,并介绍了干净地处理失败的技术,希望对大家有所帮助
    2024-02-02
  • golang interface{}类型转换的实现示例

    golang interface{}类型转换的实现示例

    在Go语言中,类型转换可以通过断言、显式、隐式和强制四种方式实现,针对interface{}类型转换为float32或float64,需要使用type断言或reflect包处理,感兴趣的可以了解一下
    2024-10-10
  • 使用Go实现伪静态URL重写功能

    使用Go实现伪静态URL重写功能

    在Web开发中,伪静态URL已成为优化网站架构和提升SEO的常用技术手段,伪静态URL是一种介于动态URL和静态URL之间的解决方案,本文给大家介绍了如何使用Go实现伪静态URL重写功能,需要的朋友可以参考下
    2024-08-08
  • Golang channel为什么不会阻塞的原因详解

    Golang channel为什么不会阻塞的原因详解

    这篇文章主要为大家介绍了Golang channel为什么不会阻塞的原因详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go项目实现mysql接入及web api的操作方法

    go项目实现mysql接入及web api的操作方法

    这篇文章主要介绍了go项目实现mysql接入以及web api,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Golang中make与new使用区别小结

    Golang中make与new使用区别小结

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存,本文主要给大家介绍了Go语言中函数new与make的使用和区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Golang在图像中绘制矩形框的示例代码

    Golang在图像中绘制矩形框的示例代码

    这篇文章主要介绍了Golang在图像中绘制矩形框的示例代码,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2008-08-08
  • Golang使用Gin创建Restful API的实现

    Golang使用Gin创建Restful API的实现

    本文主要介绍了Golang使用Gin创建Restful API的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • goland设置控制台折叠效果

    goland设置控制台折叠效果

    这篇文章主要介绍了goland设置控制台折叠效果,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论