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 compreender sua estrutura ajuda você a lidar com erros de maneira eficaz em suas aplicações de POO.

Ao lançar uma exceção, você cria uma instância da classe Exception (ou de 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 uma 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;
    }
}

Todo objeto de exceção contém 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. Usar 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 criar um sistema de gerenciamento de estoque que usa as classes de exceção integradas do PHP para sinalizar diferentes tipos de problemas. Você criará um inventário de produtos no qual 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 represente 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 gerencie uma coleção de produtos. Inclua o arquivo Product. Sua classe deve ter:
    • Um array privado para armazenar produtos indexados por SKU
    • Um método addProduct(Product $product): void que adiciona um produto. Se já existir um produto com o mesmo SKU, 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, o 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 pela 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.

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, name e quantidade inicial de 10 fornecidos
    // TODO: Adicionar o produto ao inventário
    
    // TODO: Com base na operação:
    // - "add": Call addStock(5) on the product, then print "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 de ": " e a mensagem
    // Hint: 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

Pratique por conta própria: Compilador de PHP online