Files
chain33-dtalk/pkg/error/interceptor.go
2022-03-17 15:59:24 +08:00

53 lines
1.3 KiB
Go

package error
import (
"context"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// WrapErr 返回gRPC状态码包装后的业务错误
func WrapErr(err error) error {
if err == nil {
return nil
}
switch e := err.(type) {
case interface{ GRPCStatus() *status.Status }:
return e.GRPCStatus().Err()
case *Error:
return status.Error(codes.Code(-e.Code()), e.Error())
default:
return status.Error(codes.Unknown, err.Error())
}
}
// ErrInterceptor 业务错误服务端一元拦截器
func ErrInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
resp, err := handler(ctx, req)
return resp, WrapErr(err)
}
// ErrClientInterceptor 业务错误客户端一元拦截器
func ErrClientInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
err := invoker(ctx, method, req, reply, cc, opts...)
return UnwrapErr(err)
}
// UnwrapErr 返回gRPC状态码解包后的业务错误
func UnwrapErr(err error) error {
if err == nil {
return nil
}
s, _ := status.FromError(err)
c := int(s.Code())
if _, ok := errorMsg[-c]; ok {
return NewError(-c)
}
return err
}