Manejo avanzado de errores
Gestión de errores consciente del contexto
Patrón de manejo de errores integral
package main
import (
"context"
"fmt"
"log"
"os/exec"
"time"
)
func executeCommandWithTimeout(command string, timeout time.Duration) error {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
cmd := exec.CommandContext(ctx, "bash", "-c", command)
output, err := cmd.CombinedOutput()
if err != nil {
if ctx.Err() == context.DeadlineExceeded {
return fmt.Errorf("command timed out: %v", err)
}
if exitError, ok := err.(*exec.ExitError); ok {
return fmt.Errorf("command failed with exit code %d: %s",
exitError.ExitCode(), string(output))
}
return err
}
return nil
}
func main() {
err := executeCommandWithTimeout("sleep 10", 5*time.Second)
if err != nil {
log.Println("Execution error:", err)
}
}
Estrategia de clasificación de errores
graph TD
A[Command Execution] --> B{Error Type}
B --> |Timeout| C[Context Timeout]
B --> |Exit Code| D[Non-Zero Exit]
B --> |System Error| E[Execution Failure]
Técnicas de manejo de errores
Técnica |
Descripción |
Caso de uso |
Tiempo límite (Context Timeout) |
Limitar el tiempo de ejecución del comando |
Comandos de larga duración |
Análisis detallado de errores |
Extraer información específica del error |
Flujos de trabajo de scripts complejos |
Mecanismos de reintento |
Implementar reintentos automáticos |
Fallos intermitentes |
Registro y reporte avanzados de errores
package main
import (
"fmt"
"log"
"os/exec"
"syscall"
)
type CommandResult struct {
Success bool
ExitCode int
Output string
ErrorDetail string
}
func executeAndAnalyzeCommand(command string) CommandResult {
cmd := exec.Command("bash", "-c", command)
output, err := cmd.CombinedOutput()
result := CommandResult{
Output: string(output),
}
if err != nil {
result.Success = false
if exitError, ok := err.(*exec.ExitError); ok {
status := exitError.Sys().(syscall.WaitStatus)
result.ExitCode = status.ExitStatus()
result.ErrorDetail = fmt.Sprintf("Command failed with exit code %d", result.ExitCode)
} else {
result.ErrorDetail = err.Error()
}
} else {
result.Success = true
}
return result
}
func main() {
result := executeAndAnalyzeCommand("ls /nonexistent")
if !result.Success {
log.Printf("Command Execution Failed: %s", result.ErrorDetail)
log.Printf("Exit Code: %d", result.ExitCode)
log.Printf("Output: %s", result.Output)
}
}
Mejores prácticas para el manejo de errores
- Utilizar el contexto para la gestión de tiempos límite
- Implementar un análisis detallado de errores
- Registrar información detallada de los errores
- Crear tipos de errores personalizados cuando sea necesario
En LabEx, enfatizamos la creación de mecanismos de manejo de errores robustos que proporcionen una comprensión clara de los fallos en la ejecución.