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.
 
 

42 lines
1.1 KiB

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 := r.(type) {
case error:
err = r
case string:
err = errors.New(r)
default:
err = errors.New("grpc server recover error")
}
grpclog.Error("grpc server error: ", r)
debug.PrintStack()
}
}()
// zlog.Debugf("call method: %s", server.FullMethod) // -> /TradingService/IndicatorSeries
resp, err = handler(ctx, req)
if err != nil {
zlog.Errorf("grpc request error: method=%s, %v", server.FullMethod, err)
} else {
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
}