You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

38 lines
972 B

package interceptor
import (
"context"
"errors"
"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"
"google.golang.org/protobuf/types/known/emptypb"
"runtime/debug"
"sonet/pkg/utils/logger"
)
func RecoverInterceptor(ctx context.Context, req any, server *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
defer func() {
if r := recover(); r != nil {
switch r.(type) {
case error:
err = r.(error)
case string:
err = errors.New(r.(string))
default:
err = errors.New("grpc server recover error")
}
grpclog.Error("grpc server error: ", r)
debug.PrintStack()
}
}()
resp, err = handler(ctx, req)
if err == nil {
if empty, ok := resp.(*emptypb.Empty); ok && empty == nil {
resp = &emptypb.Empty{} // grpc: error while marshaling: proto: Marshal called with nil
} else if resp == nil {
logger.Warningf("grpc request: has no response: method=%s, %v", server.FullMethod, req)
}
}
return
}