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 IdadeInvalidaException deve estender Exception.
  • A função validarIdade deve 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

  1. Definimos IdadeInvalidaException como uma subclasse de Exception — não precisamos de métodos extras.
  2. A função validarIdade verifica se a idade está fora do intervalo permitido e lança a exceção com a mensagem formatada.
  3. No primeiro teste, chamamos validarIdade(-5) dentro de um try.
  4. A exceção é capturada pelo catch específico, que imprime a mensagem.
  5. O finally imprime "Validação concluída".
  6. Repetimos o processo para 200, com outro try/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 por catch (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