juju/retry take 2 - looping
Katherine Cox-Buday
katherine.cox-buday at canonical.com
Wed Oct 26 13:38:35 UTC 2016
John Meinel <john at arbash-meinel.com> writes:
> The one things I'll specifically note about your "simple" example is
> that it doesn't actually handle errors. The fact that the "quick way
> to write it" is actually wrong is the specific argument of this
> thread.
Thanks for raising that point. I agree that coercing the developer into doing the right thing is an important point to consider when discussing these two approaches. I reject the fact that failed to do so in email as a straw-man argument as to how often this will occur.
> In your loop you have a way to generate a FinalResult, but no handling of the actual "I couldn't
> get a result". The way above that you can tell the loop failed would be to check if FinalResult
> doesn't have a valid value.
If I were truly writing this code in production, it would actually look more like this:
func foo() {
/*...*/
result, err := maybeSomeFunc(spec)
if err != nil {
return errors.Trace(err)
}
/*...*/
}
func maybeSomeFunc(spec retry.Spec) (interface{}, error) {
var finalErr error
for loop := retry.Loop(spec); loop.Next(); {
result, err := SomeFunc(blah)
if err != nil || resultNotGoodEnough(result) {
finalErr = err
continue
}
return result, nil
}
return nil, finalErr
}
And this doesn't take into account preemption, or the minutia of the domain-specific problem -- I might even write it differently depending on what I'm retrying. I.e. it's really hard to write a representative example. And that's kind of the point, right? We want to value composability for this very reason.
--
Katherine
More information about the Juju-dev
mailing list