Golang errors

From wikinotes

Go seems to discourage the use of exception-style control-flows,
encouraging the use of errors in return-values instead.

Returned Errors

Except for very exceptional circumstances, go encourages the use of returned error values.

func sudo(user string, command string) (exitcode int, error) {
    // ...
    if success {
        return 0, nil
    }
    return 1, fmt.Errorf("User does not exist")
}


output, err := sudo("root", "cat /etc/passwd");

Panic

panic

A panic is go's repacement for exceptions.
If a panic is not caught, it bubbles to the top of the application, and it exits with an error.

panic("I encountered an error")

recover

You can check the value of a panic (if one has been raised) using recover().

panic("I encountered an error")  // raise a panic
err := recover()                 // returns nil/error-msg-if-present

It is common to handle panics in deferred functions

func main() {
    fmt.Println("hi")
    panic("I just encountered an error")
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Error: ", err)
            panic(err)                         // <<-- re-raise panic
        }
    }

    fmt.Println("bye")  // <-- never runs
}