Fácil PHP

Divisão segura com finally

Enunciado

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".

Requisitos

  • A função dividir deve lançar Exception quando $b == 0.
  • O bloco catch deve capturar a exceção e imprimir sua mensagem.
  • O bloco finally deve imprimir "Fim do programa".
  • A saída deve conter a mensagem de erro e a mensagem do finally.

Código inicial

<?php

function dividir($a, $b) {
    // Se $b for zero, lance uma exceção
    // Caso contrário, retorne $a / $b
}

try {
    // Chame dividir(10, 0) e imprima o resultado
} catch (Exception $e) {
    // Imprima a mensagem da exceção
} finally {
    // Imprima "Fim do programa"
}

Saída esperada

Divisão por zero não permitida
Fim do programa
Ver dica

Use throw new Exception("mensagem") dentro da função. No catch, use $e->getMessage() para obter a mensagem.

Mostrar solução
<?php

function dividir($a, $b) {
    if ($b == 0) {
        throw new Exception("Divisão por zero não permitida");
    }
    return $a / $b;
}

try {
    echo dividir(10, 0) . "\n";
} catch (Exception $e) {
    echo $e->getMessage() . "\n";
} finally {
    echo "Fim do programa\n";
}

Passo a passo

  1. A função dividir recebe dois números e verifica se o divisor é zero.
  2. Se for zero, lança uma Exception com a mensagem especificada.
  3. Caso contrário, retorna o resultado da divisão.
  4. No bloco try, chamamos dividir(10, 0) e tentamos imprimir o resultado.
  5. Como a exceção é lançada, a execução pula para o catch, que captura e imprime a mensagem.
  6. O bloco finally é executado em seguida, imprimindo "Fim do programa".

Por que funciona

O try delimita o código que pode falhar. Quando a exceção é lançada, o fluxo é desviado para o catch correspondente. O finally garante que a mensagem final seja impressa independentemente de erro.

Erros comuns

  • Esquecer de lançar a exceção: if ($b == 0) { return 0; } — isso não gera erro e o catch não é executado.
  • Não usar finally e colocar a mensagem após o try/catch: se ocorrer uma exceção não capturada, a mensagem não seria impressa.
  • Capturar Exception mas lançar Error: Error não é subclasse de Exception, então não seria capturado.

Outra forma de resolver

Usar Throwable no catch para capturar tanto Exception quanto Error:

} catch (Throwable $e) {
    echo $e->getMessage() . "\n";
}

Isso é útil quando você quer tratar qualquer tipo de erro.

Saída esperada

Divisão por zero não permitida
Fim do programa