使用自定义错误码拦截grpc内部状态码问题
作者: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
:表示请求没有有效的操作认证凭证
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。