error-handling-patterns

Comprehensive error handling patterns across Python, TypeScript, Rust, and Go with language-specific implementations. Covers error philosophies (exceptions vs Result types), error categories (recoverable vs unrecoverable), and language-specific patterns including custom exception hierarchies, Result types, and async error handling Includes three universal patterns: circuit breaker for preventing cascading failures, error aggregation for collecting multiple errors, and graceful degradation with fallback functions Provides best practices for fail-fast validation, meaningful error messages, resource cleanup, and type-safe error handling with concrete code examples Highlights common pitfalls like overly broad exception catching, empty catch blocks, poor error messages, and unhandled async errors

INSTALLATION
npx skills add https://github.com/wshobson/agents --skill error-handling-patterns
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

Error Handling Patterns

Build resilient applications with robust error handling strategies that gracefully handle failures and provide excellent debugging experiences.

When to Use This Skill

  • Implementing error handling in new features
  • Designing error-resilient APIs
  • Debugging production issues
  • Improving application reliability
  • Creating better error messages for users and developers
  • Implementing retry and circuit breaker patterns
  • Handling async/concurrent errors
  • Building fault-tolerant distributed systems

Core Concepts

1. Error Handling Philosophies

Exceptions vs Result Types:

  • Exceptions: Traditional try-catch, disrupts control flow
  • Result Types: Explicit success/failure, functional approach
  • Error Codes: C-style, requires discipline
  • Option/Maybe Types: For nullable values

When to Use Each:

  • Exceptions: Unexpected errors, exceptional conditions
  • Result Types: Expected errors, validation failures
  • Panics/Crashes: Unrecoverable errors, programming bugs

2. Error Categories

Recoverable Errors:

  • Network timeouts
  • Missing files
  • Invalid user input
  • API rate limits

Unrecoverable Errors:

  • Out of memory
  • Stack overflow
  • Programming bugs (null pointer, etc.)

Detailed patterns and worked examples

Detailed pattern documentation lives in references/details.md. Read that file when the navigation tier above is insufficient.

Best Practices

  • Fail Fast: Validate input early, fail quickly
  • Preserve Context: Include stack traces, metadata, timestamps
  • Meaningful Messages: Explain what happened and how to fix it
  • Log Appropriately: Error = log, expected failure = don't spam logs
  • Handle at Right Level: Catch where you can meaningfully handle
  • Clean Up Resources: Use try-finally, context managers, defer
  • Don't Swallow Errors: Log or re-throw, don't silently ignore
  • Type-Safe Errors: Use typed errors when possible
# Good error handling example

def process_order(order_id: str) -> Order:

    """Process order with comprehensive error handling."""

    try:

        # Validate input

        if not order_id:

            raise ValidationError("Order ID is required")

        # Fetch order

        order = db.get_order(order_id)

        if not order:

            raise NotFoundError("Order", order_id)

        # Process payment

        try:

            payment_result = payment_service.charge(order.total)

        except PaymentServiceError as e:

            # Log and wrap external service error

            logger.error(f"Payment failed for order {order_id}: {e}")

            raise ExternalServiceError(

                f"Payment processing failed",

                service="payment_service",

                details={"order_id": order_id, "amount": order.total}

            ) from e

        # Update order

        order.status = "completed"

        order.payment_id = payment_result.id

        db.save(order)

        return order

    except ApplicationError:

        # Re-raise known application errors

        raise

    except Exception as e:

        # Log unexpected errors

        logger.exception(f"Unexpected error processing order {order_id}")

        raise ApplicationError(

            "Order processing failed",

            code="INTERNAL_ERROR"

        ) from e

Common Pitfalls

  • Catching Too Broadly: except Exception hides bugs
  • Empty Catch Blocks: Silently swallowing errors
  • Logging and Re-throwing: Creates duplicate log entries
  • Not Cleaning Up: Forgetting to close files, connections
  • Poor Error Messages: "Error occurred" is not helpful
  • Returning Error Codes: Use exceptions or Result types
  • Ignoring Async Errors: Unhandled promise rejections
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card