Gestion pratique des erreurs
Stratégies de gestion d'erreurs complètes
Une gestion efficace des erreurs est cruciale pour une exécution robuste de commandes shell en Python. Cette section explore des techniques pratiques pour gérer et atténuer les problèmes potentiels.
Modèles de gestion d'erreurs
1. Enveloppe d'exécution de commande robuste
import subprocess
import logging
import sys
def execute_command(command, retry_count=1):
"""
Execute shell command with error handling and retry mechanism
"""
for attempt in range(retry_count):
try:
result = subprocess.run(
command,
capture_output=True,
text=True,
check=True
)
return result.stdout.strip()
except subprocess.CalledProcessError as e:
logging.error(f"Command failed (Attempt {attempt + 1}): {e}")
if attempt == retry_count - 1:
logging.critical(f"Command {command} failed after {retry_count} attempts")
return None
Workflow de gestion d'erreurs
flowchart TD
A[Shell Command] --> B{Command Execution}
B -->|Success| C[Return Result]
B -->|Failure| D{Retry Allowed?}
D -->|Yes| E[Retry Command]
D -->|No| F[Log Error]
E --> B
F --> G[Handle Fallback]
Stratégies de gestion d'erreurs
Stratégie |
Description |
Cas d'utilisation |
Mécanisme de rejeu |
Tenter la commande plusieurs fois |
Erreurs réseau/système transitoires |
Journalisation |
Enregistrer les détails des erreurs |
Débogage et surveillance |
Actions de secours |
Chemins d'exécution alternatifs |
Assurer la résilience du système |
2. Journalisation complète des erreurs
import logging
import subprocess
## Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s: %(message)s'
)
def safe_command_execution(command, fallback_command=None):
try:
result = subprocess.run(
command,
capture_output=True,
text=True,
check=True
)
logging.info(f"Command {command} executed successfully")
return result.stdout
except subprocess.CalledProcessError as e:
logging.error(f"Command failed: {e}")
logging.error(f"Error output: {e.stderr}")
if fallback_command:
logging.warning("Attempting fallback command")
return safe_command_execution(fallback_command)
return None
Techniques avancées de gestion d'erreurs
Gestion d'exceptions personnalisées
class ShellCommandError(Exception):
"""Custom exception for shell command errors"""
def __init__(self, command, error_output):
self.command = command
self.error_output = error_output
super().__init__(f"Command {command} failed: {error_output}")
def execute_with_custom_error(command):
try:
result = subprocess.run(
command,
capture_output=True,
text=True,
check=True
)
return result.stdout
except subprocess.CalledProcessError as e:
raise ShellCommandError(command, e.stderr)
Pratiques recommandées par LabEx
Chez LabEx, nous mettons l'accent sur :
- Une journalisation complète des erreurs
- La mise en œuvre de mécanismes de rejeu
- La création de stratégies de secours
- L'utilisation de gestion d'erreurs personnalisées
Points clés à retenir
- Toujours implémenter une gestion d'erreurs pour les commandes shell
- Utiliser la journalisation pour suivre et diagnostiquer les problèmes
- Créer des stratégies de gestion d'erreurs flexibles
- Considérer les mécanismes de rejeu et de secours