El concepto de errores
Parte de la sección Fundamentos del Journey de GO de Coddy — lección 102 de 109.
En Go, los errores son valores que indican que algo salió mal. Go maneja los errores de forma explícita en lugar de usar excepciones.
Vamos a crear una función que podría producir un error al dividir números:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Esta función devuelve dos valores: el resultado de la división y un posible error. Si el divisor es cero, devolvemos un mensaje de error en lugar de intentar la división.
Ahora, usemos nuestra función y manejemos cualquier error potencial:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Después de ejecutar este código, veremos un mensaje de error en la pantalla porque intentamos dividir por cero:
Error: cannot divide by zeroEsto demuestra el patrón de manejo de errores de Go: verificar si ocurrió un error (err != nil) y luego tomar la acción apropiada. Si no ocurrió ningún error, podemos usar el resultado de forma segura.
Desafío
FácilEn este desafío, practicarás el trabajo con errores en Go. Crearás una función que divida dos números y devuelva un error si se intenta una división por cero.
Tu tarea es:
- Completa la función
divideque toma dos enteros y devuelve su cociente y un error. - Si el divisor es cero, devuelve 0 y un error con el mensaje "division by zero".
- Si la división es válida, devuelve el resultado y
nilpara el error. - En la función
main, llama adividecon los valores proporcionados y maneja cualquier error de manera apropiada.
Este ejercicio demuestra cómo las funciones de Go comúnmente devuelven un resultado y un error, y cómo verificar y manejar esos errores.
Hoja de referencia
En Go, los errores son valores que indican que algo salió mal. Go maneja los errores de forma explícita en lugar de utilizar excepciones.
Las funciones que podrían fallar devuelven dos valores: el resultado y un error potencial:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Para manejar errores, verifique si el error no es nil:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Utilice errors.New() para crear nuevos mensajes de error y devuelva nil cuando no ocurra ningún error.
Pruébalo tú mismo
package main
import (
"errors"
"fmt"
)
// divide divide a entre b y devuelve el resultado
// Si b es 0, devuelve un error
func divide(a, b int) (int, error) {
// TODO: Implementar la función divide
// Si b es 0, devolver 0 y un error con el mensaje "division by zero"
// De lo contrario, devolver a/b y nil para el error
}
func main() {
// Primer caso de prueba
a, b := 10, 2
result, err := divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
// Segundo caso de prueba
a, b = 8, 0
result, err = divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
4Operadores de comparación y lógicos
Operadores de comparación - Parte 1Operadores de comparación - Parte 2Operador lógico ANDOperador lógico OROperador lógico NOTConceptos básicos de precedencia de operadoresResumen: Realizar comparaciones7Flujo de control: Bucles
Explicación del bucle `for`Bucle `for` - BásicoBucle `for` - Solo condiciónLa palabra clave `break`La palabra clave `continue`Bucles anidadosResumen - Repetición de acciones2Variables y tipos de datos básicos
¿Qué es una variable?Inferencia de tipos con `:=`Enteros (int)Números de punto flotanteBooleanosStringsValores ceroConstantesConvenciones de nomenclaturaResumen - Variables y tipos5Entrada y salida básica
Salida con formatoVerbos de formatoImpresión de tiposObtener entrada básica del usuarioResumen: Entrada y salida8Funciones
Comprendiendo las funcionesDeclaración de una funciónLlamada a funcionesParámetros de funciónRetorno de un solo valorRetorno de múltiples valoresValores de retorno con nombreConceptos básicos del alcance de las funcionesResumen: Creando código reutilizable11Tipos compuestos: Slices
Introducción a los SlicesDeclaración de literales de SliceCreación de Slices con `make`Longitud vs. Capacidad de un SliceAcceso a los elementos del SliceAñadir elementosSlicing de Slices/Arrays existentesIterar sobre SlicesCopiar SlicesResumen - Listas dinámicas14Manejo básico de errores
El concepto de erroresLa interfaz `error`Funciones que devuelven erroresComprobación de erroresCreación de errores simplesCreación de errores con formatoManejo básico de erroresResumen: Manejo de problemas3Operadores básicos
Operadores aritméticosOperador de divisiónEl operador móduloOperador de asignaciónOperadores de asignación compuestaIncremento y decrementoResumen - Cálculos6Flujo de control: Condicionales
La sentencia `if`La palabra clave `else`La palabra clave `else if`Sombreado de variables en `if`Inicialización de variablesLa sentencia `switch``switch` con expresiones`switch` sin expresiónLa palabra clave `fallthrough`Resumen: Toma de decisiones