C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
A method might work when we test it. But it is just waiting to fail at the worst moment. Go provides ways to handle errors.
With recover, a built-in method, we get errors and can test them. We must specify a call to recover() in a "defer" method. The Go runtime calls these methods when an error occurs.
First example. Let us begin. This program introduces a hopeless method called "divideByZero." It causes an error to occur whenever it is run.
Defer: In divideByZero we specify a nested "defer" method. In this func we assign err to the result of recover().
And: If err is not nil, we take an action that can repair the program's state and keep it from terminating.
Tip: In this program, if we remove the divide by zero error, the value of "dog" will be printed. And the "defer" func will never be called.
Based on:
Golang 1.4
Golang program that uses recover, defer func
package main
import "fmt"
func divideByZero() {
// Use this deferred function to handle errors.
defer func() {
if err := recover(); err != nil {
fmt.Println("HERE")
fmt.Println(err)
fmt.Println(0)
}
}()
// Cause an error.
// ... Go will run the defer func above.
cat := 0
dog := 10 / cat
fmt.Println(dog)
}
func main() {
// Create a divide by zero error and handle it.
divideByZero()
}
Output
HERE
runtime error: integer divide by zero
0


Panic. This built-in method causes an error to occur. We can handle this error in a defer method that tests the result of recover().
Tip: When panic is called, the stack is unwound. And each method is tested for a defer method.
Recover: The recover() method returns panic's error. In this program, the WRONG message is provided.
Golang program that uses panic, defer and recover
package main
import "fmt"
func explode() {
// Cause a panic.
panic("WRONG")
}
func main() {
// Handle errors in defer func with recover.
defer func() {
if err := recover(); err != nil {
// Handle our error.
fmt.Println("FIX")
fmt.Println("ERR", err)
}
}()
// This causes an error.
explode()
}
Output
FIX
ERR WRONG


With recover, defer and panic we handle errors in Go programs. This is an alternative to exception handling (like try and catch in other languages).