Mejores Prácticas para el Manejo de Errores
Estrategia de errores consistente entre bibliotecas y aplicaciones.
Busca en todas las páginas de la documentación
Estrategia de errores consistente entre bibliotecas y aplicaciones.
Los equipos de Go envían código más rápido cuando cada paquete está de acuerdo en cómo se crean, envuelven, inspeccionan, registran y exponen los errores a los clientes.
Estas reglas convierten los artículos de manejo de errores en esta sección en hábitos revisables para bibliotecas, servicios y CLIs.
error.error inmediatamente. Los errores ignorados son bugs; usa linters (errcheck) en CI.(cero, err) en caso de fallo; nunca uses el valor de éxito cuando err != nil. Los llamadores dependen de este invariante.errors.Is y errors.As en lugar de == y coincidencias de cadenas. Sobrevive a cadenas de envoltura y cambios de redacción.fmt.Errorf("operación: %w", err) para añadir contexto. Una envoltura por capa con nombres de operación significativos.nil error en caso de éxito, no punteros nil tipados. Previene sorpresas de err != nil en rutas de éxito.registran y devuelven el mismo error. Evita ruido de registro duplicado a menos que añadas contexto único no disponible previamente.panic para validaciones esperadas o fallos de I/O en bibliotecas. Devuelve error para que los llamadores controlen el comportamiento de salida.%v en lugar de %w en los límites públicos cuando las causas internas deban permanecer ocultas. Compromiso de seguridad y abstracción.problem, código gRPC), no texto crudo de Error(). Los clientes se ramifican según los códigos.context.DeadlineExceeded a respuestas de tiempo de espera (504/408, gRPC deadline exceeded). Distingue tiempos de espera de no encontrado.Retryable() bool o código gRPC documentado.errors.Join cuando todos los campos importan. Respuesta única que lista cada fallo.err compartidas desde goroutines sin sincronización. Usa canales o errgroup.errgroup.WithContext. Ahorra cuotas y CPU.context.Context y envuelve ctx.Err() con %w. Los llamadores distinguen la cancelación del fallo de I/O.debug.Stack en diagnósticos de aplicaciones, no en bibliotecas reutilizables. Las pilas son para operadores.errors.Is, errors.As, y estados HTTP/gRPC mapeados. Las pruebas solo de rutas de éxito se pierden regresiones.ErrX en PascalCase. Coincide con las convenciones de la biblioteca estándar.Error() concisas y estables en significado. La lógica del programa utiliza campos y Is/As, no subcadenas.No. Registra en los límites o cuando añadas contexto de diagnóstico único. De lo contrario, devuelve errores envueltos al nivel superior.
Cuando el error ya contiene suficiente contexto para el siguiente llamador, o cuando se usa %v para ocultar intencionalmente la cadena.
Tan pocos como sea posible para el contrato documentado. Prefiere extender códigos en un tipo en lugar de añadir muchos sentinels.
Sí. Mapea los resultados de errors.Is a exit 1/2/etc. e imprime mensajes amigables para el usuario en stderr.
Raramente para salida de CLI dirigida al usuario. Nunca para lógica de biblioteca; usa Is/As.
Los paquetes de dominio compartidos permanecen agnósticos al transporte; cada binario (API, worker, CLI) posee la política de mapeo y registro.
Prefiere la biblioteca estándar %w, errors.Is, y errors.As en código nuevo. Las pilas heredadas pueden envolverse gradualmente.
Habilita errcheck, errorlint, y wrapcheck (política de equipo) en golangci-lint para un estilo consistente de envoltura y comparación.
Documentación OpenAPI/gRPC que lista códigos y estados estables; nunca documentes cadenas de controladores internas.
Cuando necesitas que todos los fallos se recopilen, no que fallen rápido. La validación y el linting por lotes son casos comunes.
Afirma errors.Is/As y campos. La igualdad de cadenas falla cuando los mensajes ganan envolturas de contexto.
Al añadir transportes (gRPC, GraphQL), cambiar la autenticación, o después de incidentes causados por mapeo de estado ambiguo.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, go fix modernizers - verifica el parche en la compilación), chi (última - verifica en la compilación), gin (última - verifica en la compilación), echo (última - verifica en la compilación), google.golang.org/grpc (última - verifica en la compilación), sigs.k8s.io/controller-runtime (última - verifica en la compilación), kubebuilder (última - verifica en la compilación), tinygo (última - verifica los objetivos de la placa en la compilación), wazero (última - verifica en la compilación), y golangci-lint (última - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026