Menu
Coddy logo textTech

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.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Fácil

Construye 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:

  1. Analizar la primera entrada dividiéndola por comas para obtener el filename, operation y status
  2. Analizar la segunda entrada dividiéndola por comas para obtener el service name y component
  3. 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"
  4. Crear un error envuelto a nivel de archivo usando fmt.Errorf con %w: "failed to [operation] file [filename]: %w"
  5. Crear un error envuelto a nivel de componente: "[component] error: %w"
  6. Crear un error envuelto a nivel de servicio: "[service_name] operation failed: %w"
  7. 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]"
  8. 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
	
}
quiz iconPonte a prueba

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