Gestion avancée des erreurs
Gestion des erreurs en fonction du contexte
Modèle de gestion complète des erreurs
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)
}
}
Stratégie de classification des erreurs
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]
Techniques de gestion des erreurs
| Technique |
Description |
Cas d'utilisation |
| Timeout du contexte |
Limiter le temps d'exécution d'une commande |
Commandes longues |
| Analyse détaillée des erreurs |
Extraire des informations d'erreur spécifiques |
Workflows de scripts complexes |
| Mécanismes de retransmission |
Mettre en œuvre des retransmissions automatiques |
Échecs intermittents |
Journalisation et rapport avancés des erreurs
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)
}
}
Bonnes pratiques de gestion des erreurs
- Utilisez le contexte pour la gestion des délais
- Mettez en œuvre une analyse complète des erreurs
- Journalisez des informations détaillées sur les erreurs
- Créez des types d'erreurs personnalisés si nécessaire
Chez LabEx, nous mettons l'accent sur la création de mécanismes de gestion d'erreurs robustes qui fournissent des informations claires sur les échecs d'exécution des commandes.