Patrones de manejo de errores
Conceptos básicos del manejo de errores
Golang ofrece múltiples estrategias para un manejo robusto de errores:
graph TD
A[Error Handling] --> B[Explicit Error Checking]
A --> C[Error Wrapping]
A --> D[Panic and Recover]
A --> E[Custom Error Types]
Patrón básico de comprobación de errores
func processData(data string) error {
if data == "" {
return fmt.Errorf("invalid data input")
}
return nil
}
func main() {
err := processData("")
if err!= nil {
fmt.Println("Error occurred:", err)
os.Exit(1)
}
}
Envoltorio de errores y contexto
func validateConfig(path string) error {
if _, err := os.Stat(path); os.IsNotExist(err) {
return fmt.Errorf("config file not found: %w", err)
}
return nil
}
Comparación de tipos de errores
Patrón |
Caso de uso |
Complejidad |
Simple Error Checking |
Escenarios básicos de error |
Bajo |
Error Wrapping |
Añadir contexto a los errores |
Medio |
Custom Error Types |
Manejo de errores especializados |
Alto |
Patrón de pánico y recuperación
func recoverFromPanic() {
defer func() {
if r := recover(); r!= nil {
fmt.Println("Recovered from panic:", r)
os.Exit(1)
}
}()
// Simulated critical section
panic("unexpected error")
}
Manejo avanzado de errores
type CustomError struct {
Code int
Message string
}
func (e *CustomError) Error() string {
return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}
func validateInput(input string) error {
if len(input) == 0 {
return &CustomError{
Code: 100,
Message: "Empty input not allowed",
}
}
return nil
}
Mejores prácticas
- Siempre maneja los errores de forma explícita
- Proporciona mensajes de error significativos
- Utiliza el envoltorio de errores para agregar contexto adicional
- Evita la supresión silenciosa de errores
- Registra los errores para la depuración
LabEx recomienda desarrollar una estrategia de manejo de errores consistente que equilibre la simplicidad y la gestión integral de errores en las aplicaciones de Golang.