Da trilha de PHP Este conceito ainda não saiu como card do dia. ir para o card de hoje

PHP Erros Intermediário

Exceções

Em PHP, exceções são objetos que representam erros ou situações inesperadas durante a execução. Elas permitem separar o tratamento de erros do fluxo normal do código, tornando-o mais robusto e legível. A classe base de todas as exceções e erros é Throwable, que pode ser capturada com catch.

O bloco try contém o código que pode lançar uma exceção. Se uma exceção for lançada, a execução do try é interrompida e o PHP procura um bloco catch compatível. O bloco finally é sempre executado, independentemente de ter ocorrido exceção ou não, sendo útil para liberar recursos.

Você pode criar exceções próprias estendendo a classe Exception (ou outra exceção existente). Isso permite representar erros específicos do seu domínio. Também é possível ter múltiplos catch para tratar tipos diferentes de exceção de forma distinta, na ordem do mais específico para o mais genérico.

Neste card, vamos explorar desde o básico de try, catch e finally até a criação de exceções personalizadas e o uso de múltiplos blocos catch para um tratamento de erros mais preciso.

Pontos-chave

  • try delimita o código que pode lançar exceções; catch captura e trata tipos específicos.
  • finally executa sempre, mesmo se uma exceção for lançada ou se houver return.
  • Throwable é a interface base para Exception e Error, permitindo capturar ambos.
  • Exceções próprias são criadas estendendo Exception e podem carregar dados adicionais.
  • Múltiplos catch tratam exceções diferentes; a ordem importa: do mais específico para o mais genérico.
excecoes.php
<?php

// Exceção personalizada para saldo insuficiente
class SaldoInsuficienteException extends Exception {
    public function __construct(float $saldo, float $valor) {
        parent::__construct("Saldo insuficiente: R$ $saldo, tentou sacar R$ $valor");
    }
}

function sacar(float $saldo, float $valor): float {
    if ($valor > $saldo) {
        throw new SaldoInsuficienteException($saldo, $valor);
    }
    return $saldo - $valor;
}

try {
    echo "Saldo após saque: " . sacar(100, 50) . "\n";
    echo "Tentando sacar 200...\n";
    sacar(100, 200);
} catch (SaldoInsuficienteException $e) {
    echo "Erro específico: " . $e->getMessage() . "\n";
} catch (Throwable $e) {
    echo "Erro genérico: " . $e->getMessage() . "\n";
} finally {
    echo "Operação finalizada.\n";
}

Exercícios

  1. 1
    Fácil

    Divisão segura com finally

    Escreva uma função dividir($a, $b) que lança uma Exception se $b for zero, com a mensagem "Divisão por zero não permitida". No código principal, chame a função com 10 e 0, capture a exceção e imprima a mensagem. Use finally para imprimir "Fim do programa".

    Resolver
  2. 2
    Médio

    Exceção personalizada para idade inválida

    Crie uma exceção personalizada IdadeInvalidaException que estende Exception. Escreva uma função validarIdade($idade) que lança essa exceção se $idade for menor que 0 ou maior que 150, com a mensagem "Idade inválida: $idade". No código principal, teste com -5 e 200, capture cada exceção separadamente e imprima a mensagem. Use finally para imprimir "Validação concluída" ao final de cada tentativa.

    Resolver
  3. 3
    Desafio

    Múltiplos catch e exceções encadeadas

    Crie duas exceções personalizadas: SaldoInsuficienteException e ValorInvalidoException, ambas estendendo Exception. Implemente uma classe ContaBancaria com saldo inicial e método sacar($valor). O método deve lançar ValorInvalidoException se $valor <= 0 e SaldoInsuficienteException se $valor > saldo. No código principal, realize três saques: -50, 200 (saldo inicial 100) e 50. Use um único bloco try com múltiplos catch para tratar cada exceção e um finally que imprime "Operação finalizada" após cada tentativa (dica: use um laço ou repita o try/catch).

    Resolver

Continue estudando