Menu
Coddy logo textTech

Clases de excepciones

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 66 de 91.

En PHP, las excepciones son objetos que se utilizan para indicar que algo salió mal durante la ejecución. La clase base para todas las excepciones es Exception, y comprender su estructura te ayuda a gestionar los errores de forma eficaz en tus aplicaciones de OOP.

Cuando lanzas una excepción, creas una instancia de la clase Exception (o una subclase) con un mensaje que describe lo que salió mal:

<?php
class BankAccount {
    public function __construct(private float $balance = 0) {}
    
    public function withdraw(float $amount): float {
        if ($amount > $this->balance) {
            throw new Exception("Insufficient funds");
        }
        $this->balance -= $amount;
        return $amount;
    }
}

$account = new BankAccount(100);
$account->withdraw(150);

Esto produciría un error de excepción no capturada con el mensaje "Insufficient funds".

PHP proporciona varias clases de excepción integradas para diferentes situaciones. InvalidArgumentException indica una entrada incorrecta, RuntimeException señala errores durante la ejecución y LogicException representa errores de programación:

<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

Cada objeto de excepción contiene información útil: getMessage() devuelve el mensaje de error, getCode() devuelve un código de error opcional, y getFile() y getLine() te indican dónde se lanzó la excepción. Usar tipos de excepción específicos hace que la intención de tu código sea más clara y permite un manejo de errores más preciso.

challenge icon

Desafío

Fácil

Construyamos un sistema de gestión de inventario que use las clases de excepciones integradas de PHP para indicar distintos tipos de problemas. Crearás un inventario de productos en el que las operaciones pueden fallar de maneras específicas y significativas.

Organizarás tu código en tres archivos:

  • Product.php: Crea una clase Product que represente un artículo del inventario. Usa la promoción de constructor para un $sku (string) público, un $name (string) público y un $quantity (int) privado. Tu clase debe tener:
    • Un método getQuantity(): int que devuelva la cantidad actual
    • Un método addStock(int $amount): void que aumente la cantidad. Si la cantidad es menor que 1, lanza una InvalidArgumentException con el mensaje "Amount must be positive"
    • Un método removeStock(int $amount): void que reduzca la cantidad. Si la cantidad es menor que 1, lanza una InvalidArgumentException con el mensaje "Amount must be positive". Si la cantidad supera la cantidad actual, lanza una RuntimeException con el mensaje "Insufficient stock"
  • Inventory.php: Crea una clase Inventory que gestione una colección de productos. Incluye el archivo Product. Tu clase debe tener:
    • Un array privado para almacenar los productos indexados por SKU
    • Un método addProduct(Product $product): void que añada un producto. Si ya existe un producto con el mismo SKU, lanza una LogicException con el mensaje "Product already exists: [sku]"
    • Un método getProduct(string $sku): Product que devuelva un producto por SKU. Si no se encuentra, lanza una InvalidArgumentException con el mensaje "Product not found: [sku]"
  • main.php: Incluye el archivo Inventory. Recibirás tres entradas: un SKU, un nombre de producto y una operación ("add", "remove" o "duplicate").

    Crea un Inventory y añade un nuevo Product con el SKU y el nombre indicados, y una cantidad inicial de 10.

    Según la operación:

    • "add": Llama a addStock(5) en el producto y después imprime "Stock updated: [quantity]"
    • "remove": Llama a removeStock(15) en el producto (esto debería lanzar una excepción)
    • "duplicate": Intenta añadir otro producto con el mismo SKU (esto debería lanzar una excepción)

    Cuando se lance una excepción, imprime el nombre de la clase de la excepción seguido de ": " y del mensaje de la excepción. Usa la función get_class() de PHP para obtener el nombre de la clase.

Este desafío demuestra cómo distintos tipos de excepciones comunican diferentes tipos de problemas —entrada no válida, fallos en tiempo de ejecución y errores lógicos—, lo que hace que el manejo de errores de tu código sea más preciso y significativo.

Pruébalo tú mismo

<?php

require_once 'Inventory.php';

// Leer entradas
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

try {
    // TODO: Crea un Inventory
    // TODO: Crea un Product con el SKU, name y cantidad inicial de 10 dados
    // TODO: Añade el producto al inventario
    
    // TODO: Basado en la operation:
    // - "add": Call addStock(5) on the product, then print "Stock updated: [quantity]"
    // - "remove": Llama a removeStock(15) en el producto
    // - "duplicate": Intenta añadir otro producto con el mismo SKU
    
} catch (Exception $e) {
    // TODO: Imprime el nombre de la clase de la excepción seguido de ": " y el mensaje
    // Hint: Usa get_class($e) para obtener el nombre de la clase
}

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online