Médio PHP
Exceção personalizada para idade inválida
Enunciado
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.
Requisitos
- A classe
IdadeInvalidaExceptiondeve estenderException. - A função
validarIdadedeve lançar a exceção para idades fora do intervalo [0, 150]. - Cada chamada deve ter seu próprio
try/catch/finally. - A saída deve conter as duas mensagens de erro e duas vezes "Validação concluída".
Código inicial
<?php
// Defina a exceção personalizada
function validarIdade($idade) {
// Lance IdadeInvalidaException se necessário
}
// Teste com -5
// Teste com 200
Saída esperada
Idade inválida: -5
Validação concluída
Idade inválida: 200
Validação concluída
Ver dica
A exceção personalizada pode ser uma classe vazia que estende Exception. Use throw new IdadeInvalidaException("mensagem").
Mostrar solução
<?php
class IdadeInvalidaException extends Exception {}
function validarIdade($idade) {
if ($idade < 0 || $idade > 150) {
throw new IdadeInvalidaException("Idade inválida: $idade");
}
return true;
}
// Teste com -5
try {
validarIdade(-5);
} catch (IdadeInvalidaException $e) {
echo $e->getMessage() . "\n";
} finally {
echo "Validação concluída\n";
}
// Teste com 200
try {
validarIdade(200);
} catch (IdadeInvalidaException $e) {
echo $e->getMessage() . "\n";
} finally {
echo "Validação concluída\n";
}
Passo a passo
- Definimos
IdadeInvalidaExceptioncomo uma subclasse deException— não precisamos de métodos extras. - A função
validarIdadeverifica se a idade está fora do intervalo permitido e lança a exceção com a mensagem formatada. - No primeiro teste, chamamos
validarIdade(-5)dentro de umtry. - A exceção é capturada pelo
catchespecífico, que imprime a mensagem. - O
finallyimprime "Validação concluída". - Repetimos o processo para
200, com outrotry/catch/finally.
Por que funciona
Cada chamada tem seu próprio bloco de tratamento, então as exceções são capturadas independentemente. O finally assegura que a mensagem de conclusão apareça mesmo se não houver exceção (mas aqui sempre há).
Erros comuns
- Esquecer de estender
Exception:class IdadeInvalidaException {}— não será capturada porcatch (IdadeInvalidaException $e). - Lançar a exceção mas não capturá-la: se não houver
catch, o script para com erro fatal. - Usar
catch (Exception $e)em vez do tipo específico: funciona, mas perde a especificidade.
Outra forma de resolver
Você pode capturar Throwable para pegar qualquer erro, mas o ideal é capturar a exceção específica para tratar cada caso.
Saída esperada
Idade inválida: -5
Validação concluída
Idade inválida: 200
Validação concluída