Skip to content

Commit 219f77e

Browse files
Merge pull request #110 from optimizely/pawel/OASIS-5242
handling recovery errors more elegantly
2 parents 8f15676 + 71108bd commit 219f77e

File tree

1 file changed

+150
-7
lines changed

1 file changed

+150
-7
lines changed

optimizely/client/client.go

Lines changed: 150 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,22 @@ type OptimizelyClient struct {
4545
// IsFeatureEnabled returns true if the feature is enabled for the given user
4646
func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entities.UserContext) (result bool, err error) {
4747

48+
defer func() {
49+
if r := recover(); r != nil {
50+
switch t := r.(type) {
51+
case error:
52+
err = t
53+
case string:
54+
err = errors.New(t)
55+
default:
56+
err = errors.New("unexpected error")
57+
}
58+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
59+
logger.Error(errorMessage, err)
60+
logger.Debug(string(debug.Stack()))
61+
}
62+
}()
63+
4864
context, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
4965
if err != nil {
5066
logger.Error("received an error while computing feature decision", err)
@@ -76,9 +92,17 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
7692

7793
defer func() {
7894
if r := recover(); r != nil {
79-
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
80-
err = errors.New(errorMessage)
95+
switch t := r.(type) {
96+
case error:
97+
err = t
98+
case string:
99+
err = errors.New(t)
100+
default:
101+
err = errors.New("unexpected error")
102+
}
103+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
81104
logger.Error(errorMessage, err)
105+
logger.Debug(string(debug.Stack()))
82106
}
83107
}()
84108

@@ -105,9 +129,17 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
105129

106130
defer func() {
107131
if r := recover(); r != nil {
108-
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
109-
err = errors.New(errorMessage)
132+
switch t := r.(type) {
133+
case error:
134+
err = t
135+
case string:
136+
err = errors.New(t)
137+
default:
138+
err = errors.New("unexpected error")
139+
}
140+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
110141
logger.Error(errorMessage, err)
142+
logger.Debug(string(debug.Stack()))
111143
}
112144
}()
113145

@@ -133,6 +165,23 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
133165

134166
// GetFeatureVariableBoolean returns boolean feature variable value
135167
func (o *OptimizelyClient) GetFeatureVariableBoolean(featureKey, variableKey string, userContext entities.UserContext) (value bool, err error) {
168+
169+
defer func() {
170+
if r := recover(); r != nil {
171+
switch t := r.(type) {
172+
case error:
173+
err = t
174+
case string:
175+
err = errors.New(t)
176+
default:
177+
err = errors.New("unexpected error")
178+
}
179+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
180+
logger.Error(errorMessage, err)
181+
logger.Debug(string(debug.Stack()))
182+
}
183+
}()
184+
136185
val, valueType, err := o.GetFeatureVariable(featureKey, variableKey, userContext)
137186
if err != nil {
138187
return false, err
@@ -146,6 +195,23 @@ func (o *OptimizelyClient) GetFeatureVariableBoolean(featureKey, variableKey str
146195

147196
// GetFeatureVariableDouble returns double feature variable value
148197
func (o *OptimizelyClient) GetFeatureVariableDouble(featureKey, variableKey string, userContext entities.UserContext) (value float64, err error) {
198+
199+
defer func() {
200+
if r := recover(); r != nil {
201+
switch t := r.(type) {
202+
case error:
203+
err = t
204+
case string:
205+
err = errors.New(t)
206+
default:
207+
err = errors.New("unexpected error")
208+
}
209+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
210+
logger.Error(errorMessage, err)
211+
logger.Debug(string(debug.Stack()))
212+
}
213+
}()
214+
149215
val, valueType, err := o.GetFeatureVariable(featureKey, variableKey, userContext)
150216
if err != nil {
151217
return 0, err
@@ -159,6 +225,23 @@ func (o *OptimizelyClient) GetFeatureVariableDouble(featureKey, variableKey stri
159225

160226
// GetFeatureVariableInteger returns integer feature variable value
161227
func (o *OptimizelyClient) GetFeatureVariableInteger(featureKey, variableKey string, userContext entities.UserContext) (value int, err error) {
228+
229+
defer func() {
230+
if r := recover(); r != nil {
231+
switch t := r.(type) {
232+
case error:
233+
err = t
234+
case string:
235+
err = errors.New(t)
236+
default:
237+
err = errors.New("unexpected error")
238+
}
239+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
240+
logger.Error(errorMessage, err)
241+
logger.Debug(string(debug.Stack()))
242+
}
243+
}()
244+
162245
val, valueType, err := o.GetFeatureVariable(featureKey, variableKey, userContext)
163246
if err != nil {
164247
return 0, err
@@ -172,6 +255,23 @@ func (o *OptimizelyClient) GetFeatureVariableInteger(featureKey, variableKey str
172255

173256
// GetFeatureVariableString returns string feature variable value
174257
func (o *OptimizelyClient) GetFeatureVariableString(featureKey, variableKey string, userContext entities.UserContext) (value string, err error) {
258+
259+
defer func() {
260+
if r := recover(); r != nil {
261+
switch t := r.(type) {
262+
case error:
263+
err = t
264+
case string:
265+
err = errors.New(t)
266+
default:
267+
err = errors.New("unexpected error")
268+
}
269+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
270+
logger.Error(errorMessage, err)
271+
logger.Debug(string(debug.Stack()))
272+
}
273+
}()
274+
175275
value, valueType, err := o.GetFeatureVariable(featureKey, variableKey, userContext)
176276
if err != nil {
177277
return "", err
@@ -185,6 +285,22 @@ func (o *OptimizelyClient) GetFeatureVariableString(featureKey, variableKey stri
185285
// GetFeatureVariable returns feature as a string along with it's associated type
186286
func (o *OptimizelyClient) GetFeatureVariable(featureKey, variableKey string, userContext entities.UserContext) (value string, valueType entities.VariableType, err error) {
187287

288+
defer func() {
289+
if r := recover(); r != nil {
290+
switch t := r.(type) {
291+
case error:
292+
err = t
293+
case string:
294+
err = errors.New(t)
295+
default:
296+
err = errors.New("unexpected error")
297+
}
298+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
299+
logger.Error(errorMessage, err)
300+
logger.Debug(string(debug.Stack()))
301+
}
302+
}()
303+
188304
context, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
189305
if err != nil {
190306
return "", "", err
@@ -206,6 +322,23 @@ func (o *OptimizelyClient) GetFeatureVariable(featureKey, variableKey string, us
206322

207323
// GetAllFeatureVariables returns all the variables for a given feature along with the enabled state
208324
func (o *OptimizelyClient) GetAllFeatureVariables(featureKey string, userContext entities.UserContext) (enabled bool, variableMap map[string]string, err error) {
325+
326+
defer func() {
327+
if r := recover(); r != nil {
328+
switch t := r.(type) {
329+
case error:
330+
err = t
331+
case string:
332+
err = errors.New(t)
333+
default:
334+
err = errors.New("unexpected error")
335+
}
336+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
337+
logger.Error(errorMessage, err)
338+
logger.Debug(string(debug.Stack()))
339+
}
340+
}()
341+
209342
variableMap = make(map[string]string)
210343
decisionContext, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
211344
if err != nil {
@@ -234,13 +367,23 @@ func (o *OptimizelyClient) GetAllFeatureVariables(featureKey string, userContext
234367
func (o *OptimizelyClient) getFeatureDecision(featureKey string, userContext entities.UserContext) (decisionContext decision.FeatureDecisionContext, featureDecision decision.FeatureDecision, err error) {
235368

236369
defer func() {
370+
var e error
237371
if r := recover(); r != nil {
238-
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
239-
logger.Error(errorMessage, err)
372+
switch t := r.(type) {
373+
case error:
374+
e = t
375+
case string:
376+
e = errors.New(t)
377+
default:
378+
e = errors.New("unexpected error")
379+
}
380+
errorMessage := fmt.Sprintf("optimizely SDK is panicking with the error:")
381+
logger.Error(errorMessage, e)
382+
logger.Debug(string(debug.Stack()))
240383

241384
// If we have a feature, then we can recover w/o throwing
242385
if decisionContext.Feature == nil {
243-
err = errors.New(errorMessage)
386+
err = e
244387
}
245388
}
246389
}()

0 commit comments

Comments
 (0)