Manejo de Errores
Go no tiene try/catch ni excepciones para el manejo de errores ordinario. En su lugar, una función que puede fallar simplemente devuelve un error como un valor extra, y quien la llama lo comprueba explícitamente — error es solo una interface con un method, Error() string.
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}Result: 5
Comprobar err no es opcional, por convención
if err != nil inmediatamente después de una llamada que devuelve un error es uno de los patrones más comunes en cualquier base de código Go. No hay ninguna imposición a nivel del lenguaje, pero el código Go idiomático comprueba cada error que recibe, justo donde se devuelve.
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}Error: cannot divide by zero
Siguiente: defer, panic, y recover — el mecanismo estrecho y deliberadamente limitado de Go parecido a las excepciones.
Practice exercise
Escribe una función safeDivide(a, b float64) (float64, error) que devuelva un error "cannot divide by zero" si b es 0, de lo contrario a/b y nil. Llámala con (10, 0), e imprime el error si lo hay.