Manejo práctico de errores
Estrategias integrales de gestión de errores
El manejo efectivo de errores es crucial para una ejecución robusta de comandos de shell en Python. Esta sección explora técnicas prácticas para gestionar y mitigar posibles problemas.
Patrones de manejo de errores
1. Envoltura (wrapper) de ejecución de comandos robusta
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
Flujo de trabajo de manejo de errores
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]
Estrategias de manejo de errores
Estrategia |
Descripción |
Caso de uso |
Mecanismo de reintentos |
Intentar el comando múltiples veces |
Errores transitorios de red/sistema |
Registro (Logging) |
Registrar detalles del error |
Depuración y monitoreo |
Acciones de recuperación (Fallback) |
Rutas de ejecución alternativas |
Asegurar la resiliencia del sistema |
2. Registro integral de errores
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
Técnicas avanzadas de manejo de errores
Manejo de excepciones personalizadas
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)
Prácticas recomendadas de LabEx
En LabEx, enfatizamos:
- Registro integral de errores
- Implementación de mecanismos de reintentos
- Creación de estrategias de recuperación (fallback)
- Uso de manejo de errores personalizados
Puntos clave
- Siempre implemente manejo de errores para comandos de shell
- Use el registro (logging) para seguir y diagnosticar problemas
- Cree estrategias flexibles de gestión de errores
- Considere mecanismos de reintentos y recuperación (fallback)