Envolver errores con `%w`
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 39 de 68.
Cuando ocurren errores en su aplicación, a menudo necesitan contexto adicional a medida que se propagan por las diferentes capas de su código. Go proporciona un mecanismo potente para esto a través del envoltorio de errores utilizando el verbo de formato %w con fmt.Errorf.
El envoltorio de errores (error wrapping) le permite agregar información contextual a un error existente mientras preserva el error original subyacente. Esto crea una cadena de errores que mantiene el historial completo de lo que salió mal:
originalErr := errors.New("file not found")
wrappedErr := fmt.Errorf("failed to load config: %w", originalErr)El verbo %w es especial: le indica a fmt.Errorf que envuelva el error en lugar de simplemente convertirlo en una cadena. Esto preserva el error original para que pueda ser examinado más tarde utilizando funciones como errors.Is y errors.As.
Este patrón es particularmente valioso en aplicaciones más grandes donde un error puede pasar a través de múltiples funciones, cada una agregando su propio contexto. Por ejemplo, un error de conexión a la base de datos podría envolverse con "failed to connect to database", luego envolverse de nuevo con "unable to start server", creando un rastro claro de lo que sucedió y dónde.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilConstruye un sistema de procesamiento de archivos que envuelva los errores con información contextual a medida que se propagan a través de las diferentes capas de tu aplicación. Este desafío demuestra cómo usar el verbo de formato %w con fmt.Errorf para crear cadenas de errores que preserven el error original mientras añaden un contexto significativo.
Recibirás dos entradas:
- Una cadena que contiene los detalles de la operación del archivo en el formato
"filename,operation,status"(por ejemplo,"config.json,read,permission_denied") - Una cadena que contiene el contexto del sistema en el formato
"service_name,component"(por ejemplo,"UserService,ConfigLoader")
Tu tarea es:
- Analizar la primera entrada dividiéndola por comas para obtener el filename, operation y status
- Analizar la segunda entrada dividiéndola por comas para obtener el service name y component
- Crear un error original basado en el status usando
errors.New():- Si el status es
"permission_denied":"permission denied" - Si el status es
"not_found":"file not found" - Si el status es
"corrupted":"file corrupted" - Para cualquier otro status:
"unknown error"
- Si el status es
- Crear un error envuelto a nivel de archivo usando
fmt.Errorfcon%w:"failed to [operation] file [filename]: %w" - Crear un error envuelto a nivel de componente:
"[component] error: %w" - Crear un error envuelto a nivel de servicio:
"[service_name] operation failed: %w" - Mostrar la cadena de errores imprimiendo cada nivel:
"Original error: [original_error_message]""File level: [file_level_error_message]""Component level: [component_level_error_message]""Service level: [service_level_error_message]"
- Mostrar un resumen de la cadena de errores:
"Error Chain Summary:""File: [filename]""Operation: [operation]""Component: [component]""Service: [service_name]""Root cause: [original_error_message]"
Usa el paquete strings para dividir las cadenas de entrada por comas, el paquete errors para crear el error original y el paquete fmt para crear los errores envueltos. Este desafío demuestra cómo el envoltorio de errores con %w crea un rastro claro de contexto a medida que los errores se mueven a través de las diferentes capas de tu aplicación, haciendo que la depuración sea mucho más efectiva.
Hoja de referencia
El envoltorio de errores (error wrapping) le permite añadir información contextual a un error existente mientras preserva el error original. Utilice el verbo de formato %w con fmt.Errorf:
originalErr := errors.New("file not found")
wrappedErr := fmt.Errorf("failed to load config: %w", originalErr)El verbo %w preserva el error original para que pueda ser examinado más tarde utilizando funciones como errors.Is y errors.As. Esto crea una cadena de errores que mantiene el historial completo de lo que salió mal, lo cual es valioso cuando los errores pasan a través de múltiples funciones en aplicaciones más grandes.
Pruébalo tú mismo
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
// Leer entrada
var fileDetails string
var systemContext string
fmt.Scanln(&fileDetails)
fmt.Scanln(&systemContext)
// Analizar entradas
fileInfo := strings.Split(fileDetails, ",")
filename := fileInfo[0]
operation := fileInfo[1]
status := fileInfo[2]
contextInfo := strings.Split(systemContext, ",")
serviceName := contextInfo[0]
component := contextInfo[1]
// TODO: Escribe tu código a continuación
// Crear el error original basado en el estado
// Crear el error envuelto a nivel de archivo
// Crear el error envuelto a nivel de componente
// Crear el error envuelto a nivel de servicio
// Imprimir cada nivel de error y el resumen
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea7Manejo de errores a fondo
Tipos de error personalizadosEnvolver errores con `%w`Desenvolver con `errors.Is`Desenvolver con `errors.As`Entendiendo `panic`Uso de `recover`Repaso - División segura2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos