Skip to content

Commit b75a7c4

Browse files
authored
Replace error type assertions with errors.As in DefaultFormattingStrategy (#353)
* Replace error type assertions with errors.As in DefaultFormattingStrategy * Add `ExceptionFromError` test cases
1 parent 91b7243 commit b75a7c4

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

strategy/exception/default_exception_formatting_strategy.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package exception
1111
import (
1212
"bytes"
1313
"crypto/rand"
14+
goerrors "errors"
1415
"fmt"
1516
"runtime"
1617
"strings"
@@ -115,7 +116,8 @@ func (dEFS *DefaultFormattingStrategy) Panicf(formatString string, args ...inter
115116
// ExceptionFromError takes an error and returns value of Exception
116117
func (dEFS *DefaultFormattingStrategy) ExceptionFromError(err error) Exception {
117118
var isRemote bool
118-
if reqErr, ok := err.(awserr.RequestFailure); ok {
119+
var reqErr awserr.RequestFailure
120+
if goerrors.As(err, &reqErr) {
119121
// A service error occurs
120122
if reqErr.RequestID() != "" {
121123
isRemote = true
@@ -133,22 +135,25 @@ func (dEFS *DefaultFormattingStrategy) ExceptionFromError(err error) Exception {
133135
Remote: isRemote,
134136
}
135137

136-
if err, ok := err.(*XRayError); ok {
137-
e.Type = err.Type
138+
xRayErr := &XRayError{}
139+
if goerrors.As(err, &xRayErr) {
140+
e.Type = xRayErr.Type
138141
}
139142

140143
var s []uintptr
141144

142145
// This is our publicly supported interface for passing along stack traces
143-
if err, ok := err.(StackTracer); ok {
144-
s = err.StackTrace()
146+
var st StackTracer
147+
if goerrors.As(err, &st) {
148+
s = st.StackTrace()
145149
}
146150

147151
// We also accept github.com/pkg/errors style stack traces for ease of use
148-
if err, ok := err.(interface {
152+
var est interface {
149153
StackTrace() errors.StackTrace
150-
}); ok {
151-
for _, frame := range err.StackTrace() {
154+
}
155+
if goerrors.As(err, &est) {
156+
for _, frame := range est.StackTrace() {
152157
s = append(s, uintptr(frame))
153158
}
154159
}

strategy/exception/exception_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"errors"
1313
"testing"
1414

15+
"github.com/aws/aws-sdk-go/aws/awserr"
1516
"github.com/stretchr/testify/assert"
1617
)
1718

@@ -105,6 +106,30 @@ func TestExceptionFromError(t *testing.T) {
105106
assert.Equal(t, "errors.errorString", err.Type)
106107
}
107108

109+
func TestExceptionFromErrorRequestFailure(t *testing.T) {
110+
defaultStrategy := &DefaultFormattingStrategy{}
111+
reqErr := awserr.NewRequestFailure(awserr.New("error code", "error message", errors.New("new error")), 400, "1234")
112+
113+
err := defaultStrategy.ExceptionFromError(reqErr)
114+
115+
assert.NotNil(t, err.ID)
116+
assert.Contains(t, err.Message, "new error")
117+
assert.Contains(t, err.Message, "1234")
118+
assert.Equal(t, "awserr.requestError", err.Type)
119+
assert.Equal(t, true, err.Remote)
120+
}
121+
122+
func TestExceptionFromErrorXRayError(t *testing.T) {
123+
defaultStrategy := &DefaultFormattingStrategy{}
124+
xRayErr := defaultStrategy.Error("new XRayError")
125+
126+
err := defaultStrategy.ExceptionFromError(xRayErr)
127+
128+
assert.NotNil(t, err.ID)
129+
assert.Equal(t, "new XRayError", err.Message)
130+
assert.Equal(t, "error", err.Type)
131+
}
132+
108133
// Benchmarks
109134
func BenchmarkDefaultFormattingStrategy_Error(b *testing.B) {
110135
defs, _ := NewDefaultFormattingStrategy()

0 commit comments

Comments
 (0)