I would likely go with something similar to how you would currently use bufio.Scanner but comine the use of .Scan() and .Text() as Range()
```go iter := rows.Iter(ctx) for obj := iter.Range { // do something with obj } if err := iter.Err(); err != nil { return err } ``` Or if rows can only have a single active iterator the there is no need for the iter object ```go for obj := rows.Range(ctx) { // do something with obj } if err := rows.Err(); err != nil { return err } ``` Graham. On Thursday, August 29, 2024 at 1:41:47 PM UTC+1 Dmitriy P wrote: > What is the best way to handle errors with iterators? > > How to handle error when we have some object and some type paginates data > (e.g. database/sql.Rows or > https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#ListObjectsV2Paginator > )? > I found three, but which should be preferable or maybe I've missed some? > > ```go > type Object smth.Smth > type Paginator interface { > GetNext(ctx) ([]Object, error) // func doing heavy request over internet > HaveNext() bool > } > ``` > > ```go > func Iter(ctx, data) iter.Seq2[Object, error] > > for obj, err := Iter(...) { > if err != nil { > return err > } > // do smth with Object > } > ``` > > ```go > func IterWithErr(ctx, data, err *error) iter.Seq[Object] > > var err error > for obj := IterWithErr(..., &err) { > // do smth with Object > } > if err != nil { > return err > } > ``` > > ```go > func IterOverIter(ctx, data) iter.Seq2[iter.Seq[Object], error] > > for page, err := IterOverIter(...) { > if err != nil { > return err > } > for obj := page(...) { > // do smth with Object > } > } > ``` > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/04859926-2b0c-4f19-a855-c0197584e3dfn%40googlegroups.com.