Skip to content

Instantly share code, notes, and snippets.

@hidez8891
Created May 30, 2018 11:25
Show Gist options
  • Save hidez8891/3e2425d20e93a78304b6e27dadf0c2df to your computer and use it in GitHub Desktop.
Save hidez8891/3e2425d20e93a78304b6e27dadf0c2df to your computer and use it in GitHub Desktop.
avoid golang error boilerplate (but, this is evil code)
package main
import (
"fmt"
)
func main() {
err := test1()
fmt.Println("test1:", err) // "test1: error message"
n, err := test2()
fmt.Println("test2:", n, err) // "test2: -1 error message"
n, err = test3()
fmt.Println("test3:", n, err) // "test3: 0 <nil>"
}
func test1() (err error) {
defer revival(func(e error) {
// overwrite return value
err = e
})
orDie(fmt.Errorf("error message"))
return nil
}
func test2() (n int, err error) {
defer revival(func(e error) {
// overwrite return value
err = e
n = -1
})
orDie(fmt.Errorf("error message"))
return 0, nil
}
func test3() (n int, err error) {
defer revival(func(e error) {
// overwrite return value
err = e
n = -1
})
orDie(nil)
return 0, nil
}
//----------------------------------
func orDie(err error) {
panic(err)
}
func revival(f func(error)) {
msg := recover()
if msg != nil {
if err, ok := msg.(error); ok {
f(err)
} else {
f(fmt.Errorf("%v", msg))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment