AnyCompiler

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)
	}
}
Output
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)
	}
}
Output
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.