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
trydelimita o código que pode lançar exceções;catchcaptura e trata tipos específicos.finallyexecuta sempre, mesmo se uma exceção for lançada ou se houverreturn.Throwableé a interface base paraExceptioneError, permitindo capturar ambos.- Exceções próprias são criadas estendendo
Exceptione podem carregar dados adicionais. - Múltiplos
catchtratam exceções diferentes; a ordem importa: do mais específico para o mais genérico.
<?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";
}