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.
39 lines
965 B
39 lines
965 B
package interceptor |
|
|
|
import ( |
|
"context" |
|
"errors" |
|
"runtime/debug" |
|
"sig-pub/pkg/zlog" |
|
|
|
"google.golang.org/grpc" |
|
"google.golang.org/grpc/grpclog" |
|
"google.golang.org/protobuf/types/known/emptypb" |
|
) |
|
|
|
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 { |
|
zlog.Warningf("grpc request: has no response: method=%s, %v", server.FullMethod, req) |
|
} |
|
} |
|
return |
|
}
|
|
|