go recover panic
ただ、↑の実装だとスタックトレースが見れないので runtime/debugpackageを使う
code:sh
func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
o := evaluateOptions(opts)
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) {
panicked := true
defer func() {
if r := recover(); r != nil || panicked {
err = recoverFrom(ctx, r, o.recoveryHandlerFunc)
}
}()
resp, err := handler(ctx, req)
panicked = false
return resp, err
}
}
func recoverFrom(ctx context.Context, p interface{}, r RecoveryHandlerFuncContext) error {
if r == nil {
// stacktraceを表示する
log.Printf("Recovered. %v\nStackTrace: %s\n", p, debug.Stack())
return status.Errorf(codes.Internal, "%v", p)
}
return r(ctx, p)
}