ASD

Python Error Handling

Patrones de manejo de errores en Python: validación de entradas, jerarquías de excepciones y manejo de fallos parciales en lotes y APIs robustas.

Estrellas
38.8k

en todo el repo

Actividad
47

0–100, la ruta de este skill

Actualizado
hace 2 meses

último commit aquí

Commits
1

últimos 90 días

Contexto
1.5k tok

61 tok en reposo

Paquete
2 archivos

11 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add wshobson/agents --skill python-error-handling --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Aplica validación temprana de entradas antes de operaciones costosas
  • Define jerarquías de excepciones específicas con contexto (ValueError, TypeError, etc.)
  • Convierte strings y datos externos en tipos de dominio en los límites del sistema
  • Maneja fallos parciales en operaciones por lotes sin abortar todo el proceso
  • Encadena excepciones con `raise ... from e` para preservar el rastro de depuración

Úsalo cuando

  • Al validar entradas de usuario o parámetros de API
  • Al diseñar jerarquías de excepciones para aplicaciones
  • Al manejar fallos parciales en operaciones por lotes
  • Al construir APIs robustas con mensajes de error claros

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Ayúdame a diseñar el manejo de excepciones para esta API en Python
    • Cómo valido los parámetros de entrada de esta función de forma robusta
    • Necesito manejar fallos parciales en un procesamiento por lotes

    SKILL.md

    En inglés

    Python Error Handling

    Build robust Python applications with proper input validation, meaningful exceptions, and graceful failure handling. Good error handling makes debugging easier and systems more reliable.

    When to Use This Skill

    • Validating user input and API parameters
    • Designing exception hierarchies for applications
    • Handling partial failures in batch operations
    • Converting external data to domain types
    • Building user-friendly error messages
    • Implementing fail-fast validation patterns

    Core Concepts

    1. Fail Fast

    Validate inputs early, before expensive operations. Report all validation errors at once when possible.

    2. Meaningful Exceptions

    Use appropriate exception types with context. Messages should explain what failed, why, and how to fix it.

    3. Partial Failures

    In batch operations, don't let one failure abort everything. Track successes and failures separately.

    4. Preserve Context

    Chain exceptions to maintain the full error trail for debugging.

    Quick Start

    def fetch_page(url: str, page_size: int) -> Page:
        if not url:
            raise ValueError("'url' is required")
        if not 1 <= page_size <= 100:
            raise ValueError(f"'page_size' must be 1-100, got {page_size}")
        # Now safe to proceed...
    

    Fundamental Patterns

    Pattern 1: Early Input Validation

    Validate all inputs at API boundaries before any processing begins.

    def process_order(
        order_id: str,
        quantity: int,
        discount_percent: float,
    ) -> OrderResult:
        """Process an order with validation."""
        # Validate required fields
        if not order_id:
            raise ValueError("'order_id' is required")
    
        # Validate ranges
        if quantity <= 0:
            raise ValueError(f"'quantity' must be positive, got {quantity}")
    
        if not 0 <= discount_percent <= 100:
            raise ValueError(
                f"'discount_percent' must be 0-100, got {discount_percent}"
            )
    
        # Validation passed, proceed with processing
        return _process_validated_order(order_id, quantity, discount_percent)
    

    Pattern 2: Convert to Domain Types Early

    Parse strings and external data into typed domain objects at system boundaries.

    from enum import Enum
    
    class OutputFormat(Enum):
        JSON = "json"
        CSV = "csv"
        PARQUET = "parquet"
    
    def parse_output_format(value: str) -> OutputFormat:
        """Parse string to OutputFormat enum.
    
        Args:
            value: Format string from user input.
    
        Returns:
            Validated OutputFormat enum member.
    
        Raises:
            ValueError: If format is not recognized.
        """
        try:
            return OutputFormat(value.lower())
        except ValueError:
            valid_formats = [f.value for f in OutputFormat]
            raise ValueError(
                f"Invalid format '{value}'. "
                f"Valid options: {', '.join(valid_formats)}"
            )
    
    # Usage at API boundary
    def export_data(data: list[dict], format_str: str) -> bytes:
        output_format = parse_output_format(format_str)  # Fail fast
        # Rest of function uses typed OutputFormat
        ...
    

    Pattern 3: Pydantic for Complex Validation

    Use Pydantic models for structured input validation with automatic error messages.

    from pydantic import BaseModel, Field, field_validator
    
    class CreateUserInput(BaseModel):
        """Input model for user creation."""
    
        email: str = Field(..., min_length=5, max_length=255)
        name: str = Field(..., min_length=1, max_length=100)
        age: int = Field(ge=0, le=150)
    
        @field_validator("email")
        @classmethod
        def validate_email_format(cls, v: str) -> str:
            if "@" not in v or "." not in v.split("@")[-1]:
                raise ValueError("Invalid email format")
            return v.lower()
    
        @field_validator("name")
        @classmethod
        def normalize_name(cls, v: str) -> str:
            return v.strip().title()
    
    # Usage
    try:
        user_input = CreateUserInput(
            email="user@example.com",
            name="john doe",
            age=25,
        )
    except ValidationError as e:
        # Pydantic provides detailed error information
        print(e.errors())
    

    Pattern 4: Map Errors to Standard Exceptions

    Use Python's built-in exception types appropriately, adding context as needed.

    Failure Type Exception Example
    Invalid input ValueError Bad parameter values
    Wrong type TypeError Expected string, got int
    Missing item KeyError Dict key not found
    Operational failure RuntimeError Service unavailable
    Timeout TimeoutError Operation took too long
    File not found FileNotFoundError Path doesn't exist
    Permission denied PermissionError Access forbidden
    # Good: Specific exception with context
    raise ValueError(f"'page_size' must be 1-100, got {page_size}")
    
    # Avoid: Generic exception, no context
    raise Exception("Invalid parameter")
    

    Detailed worked examples and patterns

    Detailed sections (starting with ## Advanced Patterns) live in references/details.md. Read that file when the navigation summary above is insufficient.

    Best Practices Summary

    1. Validate early - Check inputs before expensive operations
    2. Use specific exceptions - ValueError, TypeError, not generic Exception
    3. Include context - Messages should explain what, why, and how to fix
    4. Convert types at boundaries - Parse strings to enums/domain types early
    5. Chain exceptions - Use raise ... from e to preserve debug info
    6. Handle partial failures - Don't abort batches on single item errors
    7. Use Pydantic - For complex input validation with structured errors
    8. Document failure modes - Docstrings should list possible exceptions
    9. Log with context - Include IDs, counts, and other debugging info
    10. Test error paths - Verify exceptions are raised correctly

    Reproducido de wshobson/agents bajo licencia MIT. Leer esta página en markdown.

    Archivos

    2 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Detalles

    Creador
    wshobson
    Licencia
    MIT
    Recursos incluidos
    referencias
    Repositorio
    wshobson/agents
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de wshobson/agents

    Este repo incluye 180 skills. Si instalas uno, normalmente ya tienes los demás.

    Úsalo al seleccionar y colocar iconos, imágenes, SVGs, diagramas o infografías de apoyo aprobados en un PPTX editable.

    Costo de contexto al activarse
    344 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo cuando pidan optimizar un prompt, mejorar su rendimiento, diseñar una plantilla, aplicar chain-of-thought, few-shot prompting o técnicas avanzadas de prompt engineering para producción.

    Costo de contexto al activarse
    1.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Úsalo al redactar o reparar una especificación JSON con coordenadas explícitas para un PPTX editable.

    Costo de contexto al activarse
    489 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para validar o reparar un PPTX editable en cuanto a geometría, accesibilidad, editabilidad nativa, linaje de fuente e integridad del paquete OOXML.

    Costo de contexto al activarse
    409 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para analizar un PPTX de referencia en modo solo lectura: estructura, tema, tipografía, ritmo de layout, diagnósticos, catálogos de plantillas derivados o inspección segura del paquete OOXML.

    Costo de contexto al activarse
    689 tok
    Tamaño del paquete
    8 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo al preparar la narrativa, las fuentes y el contexto de diseño para un nuevo deck PPTX editable.

    Costo de contexto al activarse
    415 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Skills relacionados

    Domina el sistema de tipos avanzado de TypeScript: generics, tipos condicionales, mapped types, template literals y utility types para aplicaciones type-safe.

    Costo de contexto al activarse
    2k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    herramientas desarrollo

    Patrones de resiliencia en Python: reintentos automáticos, backoff exponencial, timeouts y decoradores tolerantes a fallos para servicios.

    Costo de contexto al activarse
    1.5k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    herramientas desarrollo

    Organización de proyectos Python, arquitectura de módulos y diseño de APIs públicas con __all__, para nuevos proyectos o reorganización de directorios.

    Costo de contexto al activarse
    1.7k tok
    Tamaño del paquete
    1 archivo
    Última actualización
    hace 6 meses
    herramientas desarrollo