Skip to content

Instantly share code, notes, and snippets.

@aybabtme
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aybabtme/9b4106595b61600d98c8 to your computer and use it in GitHub Desktop.
Save aybabtme/9b4106595b61600d98c8 to your computer and use it in GitHub Desktop.
Lazy error handling for overly verbose error producers.
// accumulates non-nil errors
type errors []error
func (e *errors) Ack(err error) {
if err != nil {
*e = append(*e, err)
}
}
func (e *errors) Err() error {
if len(*e) == 0 {
return nil
}
return e
}
func (e *errors) Error() string {
errs := make([]string, len(*e))
for i, err := range *e {
errs[i] = err.Error()
}
return strings.Join(errs, ",")
}
// use it like this (snippet from a binary decoder)
func readMapStringString(r io.Reader, tgt *map[string]string) error {
var errs errors
var mLen int
errs.Ack(readInt(r, &mLen))
v := make(map[string]string, mLen)
var key, val string
for i := 0; i < mLen; i++ {
errs.Ack(readString(r, &key))
errs.Ack(readString(r, &val))
v[key] = val
}
*tgt = v
return errs.Err()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment