Skip to content

Commit 4dbe540

Browse files
authored
GODRIVER-2603 (Contd.) Revised error handling using Go 1.13 error APIs (#1488)
1 parent 2f0917c commit 4dbe540

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+219
-217
lines changed

bson/bsoncodec/default_value_encoders_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1776,7 +1776,7 @@ func TestDefaultValueEncoders(t *testing.T) {
17761776
enc, err := reg.LookupEncoder(reflect.TypeOf(tc.value))
17771777
noerr(t, err)
17781778
err = enc.EncodeValue(EncodeContext{Registry: reg}, vw, reflect.ValueOf(tc.value))
1779-
if err != tc.err {
1779+
if !errors.Is(err, tc.err) {
17801780
t.Errorf("Did not receive expected error. got %v; want %v", err, tc.err)
17811781
}
17821782
if diff := cmp.Diff([]byte(b), tc.b); diff != "" {

bson/bsoncodec/map_codec.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (mc *MapCodec) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, v
129129
}
130130

131131
currEncoder, currVal, lookupErr := defaultValueEncoders.lookupElementEncoder(ec, encoder, val.MapIndex(key))
132-
if lookupErr != nil && lookupErr != errInvalidValue {
132+
if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
133133
return lookupErr
134134
}
135135

bson/bsoncodec/registry_test.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,7 @@ func TestRegistryBuilder(t *testing.T) {
352352
})
353353
t.Run("Decoder", func(t *testing.T) {
354354
wanterr := tc.wanterr
355-
var ene ErrNoEncoder
356-
if errors.As(tc.wanterr, &ene) {
355+
if ene, ok := tc.wanterr.(ErrNoEncoder); ok {
357356
wanterr = ErrNoDecoder(ene)
358357
}
359358

@@ -424,7 +423,7 @@ func TestRegistryBuilder(t *testing.T) {
424423
want = nil
425424
wanterr := ErrNoTypeMapEntry{Type: bsontype.ObjectID}
426425
got, err = reg.LookupTypeMapEntry(bsontype.ObjectID)
427-
if err != wanterr {
426+
if !errors.Is(err, wanterr) {
428427
t.Errorf("did not get expected error: got %#v, want %#v", err, wanterr)
429428
}
430429
if got != want {
@@ -777,8 +776,7 @@ func TestRegistry(t *testing.T) {
777776
t.Parallel()
778777

779778
wanterr := tc.wanterr
780-
var ene ErrNoEncoder
781-
if errors.As(tc.wanterr, &ene) {
779+
if ene, ok := tc.wanterr.(ErrNoEncoder); ok {
782780
wanterr = ErrNoDecoder(ene)
783781
}
784782

@@ -884,7 +882,7 @@ func TestRegistry(t *testing.T) {
884882
want = nil
885883
wanterr := ErrNoTypeMapEntry{Type: bsontype.ObjectID}
886884
got, err = reg.LookupTypeMapEntry(bsontype.ObjectID)
887-
if err != wanterr {
885+
if !errors.Is(err, wanterr) {
888886
t.Errorf("unexpected error: got %#v, want %#v", err, wanterr)
889887
}
890888
if got != want {

bson/bsoncodec/slice_codec.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package bsoncodec
88

99
import (
10+
"errors"
1011
"fmt"
1112
"reflect"
1213

@@ -93,7 +94,7 @@ func (sc SliceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val re
9394

9495
for idx := 0; idx < val.Len(); idx++ {
9596
currEncoder, currVal, lookupErr := defaultValueEncoders.lookupElementEncoder(ec, encoder, val.Index(idx))
96-
if lookupErr != nil && lookupErr != errInvalidValue {
97+
if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
9798
return lookupErr
9899
}
99100

@@ -102,7 +103,7 @@ func (sc SliceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val re
102103
return err
103104
}
104105

105-
if lookupErr == errInvalidValue {
106+
if errors.Is(lookupErr, errInvalidValue) {
106107
err = vw.WriteNull()
107108
if err != nil {
108109
return err

bson/bsoncodec/struct_codec.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ func (sc *StructCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val
164164

165165
desc.encoder, rv, err = defaultValueEncoders.lookupElementEncoder(ec, desc.encoder, rv)
166166

167-
if err != nil && err != errInvalidValue {
167+
if err != nil && !errors.Is(err, errInvalidValue) {
168168
return err
169169
}
170170

171-
if err == errInvalidValue {
171+
if errors.Is(err, errInvalidValue) {
172172
if desc.omitEmpty {
173173
continue
174174
}
@@ -308,7 +308,7 @@ func (sc *StructCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val
308308

309309
for {
310310
name, vr, err := dr.ReadElement()
311-
if err == bsonrw.ErrEOD {
311+
if errors.Is(err, bsonrw.ErrEOD) {
312312
break
313313
}
314314
if err != nil {

bson/bsonrw/extjson_reader_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package bsonrw
88

99
import (
10+
"errors"
1011
"fmt"
1112
"io"
1213
"strings"
@@ -131,7 +132,7 @@ func readAllDocuments(vr ValueReader) ([][]byte, error) {
131132
for {
132133
result, err := c.CopyDocumentToBytes(vr)
133134
if err != nil {
134-
if err == io.EOF {
135+
if errors.Is(err, io.EOF) {
135136
break
136137
}
137138
return nil, err
@@ -147,7 +148,7 @@ func readAllDocuments(vr ValueReader) ([][]byte, error) {
147148
for {
148149
evr, err := ar.ReadValue()
149150
if err != nil {
150-
if err == ErrEOA {
151+
if errors.Is(err, ErrEOA) {
151152
break
152153
}
153154
return nil, err

bson/bsonrw/json_scanner.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -325,17 +325,17 @@ func (js *jsonScanner) scanLiteral(first byte) (*jsonToken, error) {
325325

326326
c5, err := js.readNextByte()
327327

328-
if bytes.Equal([]byte("true"), lit) && (isValueTerminator(c5) || err == io.EOF) {
328+
if bytes.Equal([]byte("true"), lit) && (isValueTerminator(c5) || errors.Is(err, io.EOF)) {
329329
js.pos = int(math.Max(0, float64(js.pos-1)))
330330
return &jsonToken{t: jttBool, v: true, p: p}, nil
331-
} else if bytes.Equal([]byte("null"), lit) && (isValueTerminator(c5) || err == io.EOF) {
331+
} else if bytes.Equal([]byte("null"), lit) && (isValueTerminator(c5) || errors.Is(err, io.EOF)) {
332332
js.pos = int(math.Max(0, float64(js.pos-1)))
333333
return &jsonToken{t: jttNull, v: nil, p: p}, nil
334334
} else if bytes.Equal([]byte("fals"), lit) {
335335
if c5 == 'e' {
336336
c5, err = js.readNextByte()
337337

338-
if isValueTerminator(c5) || err == io.EOF {
338+
if isValueTerminator(c5) || errors.Is(err, io.EOF) {
339339
js.pos = int(math.Max(0, float64(js.pos-1)))
340340
return &jsonToken{t: jttBool, v: false, p: p}, nil
341341
}
@@ -413,7 +413,7 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
413413
case '}', ']', ',':
414414
s = nssDone
415415
default:
416-
if isWhiteSpace(c) || err == io.EOF {
416+
if isWhiteSpace(c) || errors.Is(err, io.EOF) {
417417
s = nssDone
418418
} else {
419419
s = nssInvalid
@@ -430,7 +430,7 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
430430
case '}', ']', ',':
431431
s = nssDone
432432
default:
433-
if isWhiteSpace(c) || err == io.EOF {
433+
if isWhiteSpace(c) || errors.Is(err, io.EOF) {
434434
s = nssDone
435435
} else if isDigit(c) {
436436
s = nssSawIntegerDigits
@@ -455,7 +455,7 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
455455
case '}', ']', ',':
456456
s = nssDone
457457
default:
458-
if isWhiteSpace(c) || err == io.EOF {
458+
if isWhiteSpace(c) || errors.Is(err, io.EOF) {
459459
s = nssDone
460460
} else if isDigit(c) {
461461
s = nssSawFractionDigits
@@ -490,7 +490,7 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
490490
case '}', ']', ',':
491491
s = nssDone
492492
default:
493-
if isWhiteSpace(c) || err == io.EOF {
493+
if isWhiteSpace(c) || errors.Is(err, io.EOF) {
494494
s = nssDone
495495
} else if isDigit(c) {
496496
s = nssSawExponentDigits

bson/bsonrw/value_reader_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,7 @@ func errequal(t *testing.T, err1, err2 error) bool {
15271527
return false
15281528
}
15291529

1530-
if err1 == err2 { // They are the same error, they are equal
1530+
if errors.Is(err1, err2) { // They are the same error, they are equal
15311531
return true
15321532
}
15331533

bson/raw_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func TestRaw(t *testing.T) {
118118
for _, tc := range testCases {
119119
t.Run(tc.name, func(t *testing.T) {
120120
err := tc.r.Validate()
121-
if err != tc.err {
121+
if !errors.Is(err, tc.err) {
122122
t.Errorf("Returned error does not match. got %v; want %v", err, tc.err)
123123
}
124124
})
@@ -128,7 +128,7 @@ func TestRaw(t *testing.T) {
128128
t.Run("empty-key", func(t *testing.T) {
129129
rdr := Raw{'\x05', '\x00', '\x00', '\x00', '\x00'}
130130
_, err := rdr.LookupErr()
131-
if err != bsoncore.ErrEmptyKey {
131+
if !errors.Is(err, bsoncore.ErrEmptyKey) {
132132
t.Errorf("Empty key lookup did not return expected result. got %v; want %v", err, bsoncore.ErrEmptyKey)
133133
}
134134
})
@@ -211,7 +211,7 @@ func TestRaw(t *testing.T) {
211211
for _, tc := range testCases {
212212
t.Run(tc.name, func(t *testing.T) {
213213
got, err := tc.r.LookupErr(tc.key...)
214-
if err != tc.err {
214+
if !errors.Is(err, tc.err) {
215215
t.Errorf("Returned error does not match. got %v; want %v", err, tc.err)
216216
}
217217
if !cmp.Equal(got, tc.want) {
@@ -224,7 +224,7 @@ func TestRaw(t *testing.T) {
224224
t.Run("Out of bounds", func(t *testing.T) {
225225
rdr := Raw{0xe, 0x0, 0x0, 0x0, 0xa, 0x78, 0x0, 0xa, 0x79, 0x0, 0xa, 0x7a, 0x0, 0x0}
226226
_, err := rdr.IndexErr(3)
227-
if err != bsoncore.ErrOutOfBounds {
227+
if !errors.Is(err, bsoncore.ErrOutOfBounds) {
228228
t.Errorf("Out of bounds should be returned when accessing element beyond end of document. got %v; want %v", err, bsoncore.ErrOutOfBounds)
229229
}
230230
})

bson/raw_value_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package bson
88

99
import (
10+
"errors"
1011
"fmt"
1112
"reflect"
1213
"testing"
@@ -57,7 +58,7 @@ func TestRawValue(t *testing.T) {
5758
want := ErrNilRegistry
5859
var val RawValue
5960
got := val.UnmarshalWithRegistry(nil, &D{})
60-
if got != want {
61+
if !errors.Is(got, want) {
6162
t.Errorf("Expected errors to match. got %v; want %v", got, want)
6263
}
6364
})
@@ -108,7 +109,7 @@ func TestRawValue(t *testing.T) {
108109
want := ErrNilContext
109110
var val RawValue
110111
got := val.UnmarshalWithContext(nil, &D{})
111-
if got != want {
112+
if !errors.Is(got, want) {
112113
t.Errorf("Expected errors to match. got %v; want %v", got, want)
113114
}
114115
})

bson/unmarshal_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package bson
88

99
import (
10+
"errors"
1011
"math/rand"
1112
"reflect"
1213
"sync"
@@ -100,7 +101,7 @@ func TestUnmarshalExtJSONWithRegistry(t *testing.T) {
100101
t.Run("UnmarshalExtJSONInvalidInput", func(t *testing.T) {
101102
data := []byte("invalid")
102103
err := UnmarshalExtJSONWithRegistry(DefaultRegistry, data, true, &M{})
103-
if err != bsonrw.ErrInvalidJSON {
104+
if !errors.Is(err, bsonrw.ErrInvalidJSON) {
104105
t.Fatalf("wanted ErrInvalidJSON, got %v", err)
105106
}
106107
})

examples/documentation_examples/examples.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package documentation_examples
88

99
import (
1010
"context"
11-
"errors"
1211
"fmt"
1312
"io/ioutil"
1413
logger "log"
@@ -1817,8 +1816,7 @@ func RunTransactionWithRetry(sctx mongo.SessionContext, txnFn func(mongo.Session
18171816
log.Println("Transaction aborted. Caught exception during transaction.")
18181817

18191818
// If transient error, retry the whole transaction
1820-
var cmdErr mongo.CommandError
1821-
if errors.As(err, &cmdErr) && cmdErr.HasErrorLabel("TransientTransactionError") {
1819+
if cmdErr, ok := err.(mongo.CommandError); ok && cmdErr.HasErrorLabel("TransientTransactionError") {
18221820
log.Println("TransientTransactionError, retrying transaction...")
18231821
continue
18241822
}
@@ -1885,8 +1883,7 @@ func TransactionsExamples(ctx context.Context, client *mongo.Client) error {
18851883
log.Println("Transaction aborted. Caught exception during transaction.")
18861884

18871885
// If transient error, retry the whole transaction
1888-
var cmdErr mongo.CommandError
1889-
if errors.As(err, &cmdErr) && cmdErr.HasErrorLabel("TransientTransactionError") {
1886+
if cmdErr, ok := err.(mongo.CommandError); ok && cmdErr.HasErrorLabel("TransientTransactionError") {
18901887
log.Println("TransientTransactionError, retrying transaction...")
18911888
continue
18921889
}

internal/aws/awserr/types.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
package awserr
1212

1313
import (
14-
"errors"
1514
"fmt"
1615
)
1716

@@ -107,8 +106,7 @@ func (b baseError) OrigErr() error {
107106
case 1:
108107
return b.errs[0]
109108
default:
110-
var err Error
111-
if errors.As(b.errs[0], &err) {
109+
if err, ok := b.errs[0].(Error); ok {
112110
return NewBatchError(err.Code(), err.Message(), b.errs[1:])
113111
}
114112
return NewBatchError("BatchedErrors",

mongo/bulk_write.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (bw *bulkWrite) execute(ctx context.Context) error {
7272

7373
bwErr.WriteErrors = append(bwErr.WriteErrors, batchErr.WriteErrors...)
7474

75-
commandErrorOccurred := err != nil && err != driver.ErrUnacknowledgedWrite
75+
commandErrorOccurred := err != nil && !errors.Is(err, driver.ErrUnacknowledgedWrite)
7676
writeErrorOccurred := len(batchErr.WriteErrors) > 0 || batchErr.WriteConcernError != nil
7777
if !continueOnError && (commandErrorOccurred || writeErrorOccurred) {
7878
if err != nil {

mongo/crud_examples_test.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package mongo_test
88

99
import (
1010
"context"
11+
"errors"
1112
"fmt"
1213
"log"
1314
"sync"
@@ -387,7 +388,7 @@ func ExampleCollection_FindOne() {
387388
if err != nil {
388389
// ErrNoDocuments means that the filter did not match any documents in
389390
// the collection.
390-
if err == mongo.ErrNoDocuments {
391+
if errors.Is(err, mongo.ErrNoDocuments) {
391392
return
392393
}
393394
log.Fatal(err)
@@ -413,7 +414,7 @@ func ExampleCollection_FindOneAndDelete() {
413414
if err != nil {
414415
// ErrNoDocuments means that the filter did not match any documents in
415416
// the collection.
416-
if err == mongo.ErrNoDocuments {
417+
if errors.Is(err, mongo.ErrNoDocuments) {
417418
return
418419
}
419420
log.Fatal(err)
@@ -442,7 +443,7 @@ func ExampleCollection_FindOneAndReplace() {
442443
if err != nil {
443444
// ErrNoDocuments means that the filter did not match any documents in
444445
// the collection.
445-
if err == mongo.ErrNoDocuments {
446+
if errors.Is(err, mongo.ErrNoDocuments) {
446447
return
447448
}
448449
log.Fatal(err)
@@ -471,7 +472,7 @@ func ExampleCollection_FindOneAndUpdate() {
471472
if err != nil {
472473
// ErrNoDocuments means that the filter did not match any documents in
473474
// the collection.
474-
if err == mongo.ErrNoDocuments {
475+
if errors.Is(err, mongo.ErrNoDocuments) {
475476
return
476477
}
477478
log.Fatal(err)

0 commit comments

Comments
 (0)