Menu
Coddy logo textTech

Classes de Exceção

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 66 de 91.

No PHP, as exceções são objetos usados para sinalizar que algo deu errado durante a execução. A classe base para todas as exceções é Exception, e entender sua estrutura ajuda você a lidar com erros de forma eficaz em suas aplicações OOP.

Quando você lança uma exceção, você cria uma instância da classe Exception (ou uma subclasse) com uma mensagem descrevendo o que deu errado:

<?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);

Isso produziria um erro de exceção não capturada com a mensagem "Insufficient funds".

O PHP fornece várias classes de exceção integradas para diferentes situações. InvalidArgumentException sinaliza entrada inválida, RuntimeException indica erros durante a execução e LogicException representa erros de programação:

<?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 exceção carrega informações úteis: getMessage() retorna a mensagem de erro, getCode() retorna um código de erro opcional, getFile() e getLine() informam onde a exceção foi lançada. O uso de tipos de exceção específicos torna a intenção do seu código mais clara e permite um tratamento de erros mais preciso.

challenge icon

Desafio

Fácil

Vamos construir um sistema de gerenciamento de inventário que utiliza as classes de exceção integradas do PHP para sinalizar diferentes tipos de problemas. Você criará um inventário de produtos onde as operações podem falhar de maneiras específicas e significativas.

Você organizará seu código em três arquivos:

  • Product.php — Crie uma classe Product que representa um item no inventário. Use a promoção de construtor para um $sku (string) público, um $name (string) público e um $quantity (int) privado. Sua classe deve ter:
    • Um método getQuantity(): int que retorna a quantidade atual
    • Um método addStock(int $amount): void que aumenta a quantidade. Se o valor for menor que 1, lance uma InvalidArgumentException com a mensagem "Amount must be positive"
    • Um método removeStock(int $amount): void que diminui a quantidade. Se o valor for menor que 1, lance uma InvalidArgumentException com a mensagem "Amount must be positive". Se o valor exceder a quantidade atual, lance uma RuntimeException com a mensagem "Insufficient stock"
  • Inventory.php — Crie uma classe Inventory que gerencia uma coleção de produtos. Inclua o arquivo Product. Sua classe deve ter:
    • Um array privado para armazenar produtos indexados pelo SKU
    • Um método addProduct(Product $product): void que adiciona um produto. Se um produto com o mesmo SKU já existir, lance uma LogicException com a mensagem "Product already exists: [sku]"
    • Um método getProduct(string $sku): Product que retorna um produto pelo SKU. Se não for encontrado, lance uma InvalidArgumentException com a mensagem "Product not found: [sku]"
  • main.php — Inclua o arquivo Inventory. Você receberá três entradas: um SKU, um nome de produto e uma operação ("add", "remove" ou "duplicate").

    Crie um Inventory e adicione um novo Product com o SKU, nome e uma quantidade inicial de 10 fornecidos.

    Com base na operação:

    • "add": Chame addStock(5) no produto e, em seguida, imprima "Stock updated: [quantity]"
    • "remove": Chame removeStock(15) no produto (isso deve lançar uma exceção)
    • "duplicate": Tente adicionar outro produto com o mesmo SKU (isso deve lançar uma exceção)

    Quando uma exceção for lançada, imprima o nome da classe da exceção seguido por ": " e a mensagem da exceção. Use a função get_class() do PHP para obter o nome da classe.

Este desafio demonstra como diferentes tipos de exceção comunicam diferentes tipos de problemas — entrada inválida, falhas em tempo de execução e erros de lógica — tornando o tratamento de erros do seu código mais preciso e significativo.

Folha de consulta

No PHP, as exceções são objetos que sinalizam erros durante a execução. A classe base é Exception.

Para lançar uma exceção, crie uma instância com uma mensagem descritiva:

<?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;
    }
}

O PHP fornece classes de exceção integradas para diferentes situações:

  • InvalidArgumentException — sinaliza uma entrada inválida
  • RuntimeException — indica erros durante a execução
  • LogicException — representa erros de programação
<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

Objetos de exceção fornecem métodos úteis:

  • getMessage() — retorna a mensagem de erro
  • getCode() — retorna um código de erro opcional
  • getFile() — retorna o arquivo onde a exceção foi lançada
  • getLine() — retorna o número da linha onde a exceção foi lançada

Use get_class() para recuperar o nome da classe de um objeto de exceção.

Experimente você mesmo

<?php

require_once 'Inventory.php';

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

try {
    // TODO: Criar um Inventory
    // TODO: Criar um Product com o SKU, nome e quantidade inicial de 10 fornecidos
    // TODO: Adicionar o produto ao inventário
    
    // TODO: Com base na operação:
    // - "add": Chamar addStock(5) no produto, então imprimir "Stock updated: [quantity]"
    // - "remove": Chamar removeStock(15) no produto
    // - "duplicate": Tentar adicionar outro produto com o mesmo SKU
    
} catch (Exception $e) {
    // TODO: Imprimir o nome da classe da exceção seguido por ": " e a mensagem
    // Dica: Use get_class($e) para obter o nome da classe
}

?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos