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
dividirdeve lançarExceptionquando$b == 0. - O bloco
catchdeve capturar a exceção e imprimir sua mensagem. - O bloco
finallydeve 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
- A função
dividirrecebe dois números e verifica se o divisor é zero. - Se for zero, lança uma
Exceptioncom a mensagem especificada. - Caso contrário, retorna o resultado da divisão.
- No bloco
try, chamamosdividir(10, 0)e tentamos imprimir o resultado. - Como a exceção é lançada, a execução pula para o
catch, que captura e imprime a mensagem. - 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 ocatchnão é executado. - Não usar
finallye colocar a mensagem após otry/catch: se ocorrer uma exceção não capturada, a mensagem não seria impressa. - Capturar
Exceptionmas lançarError:Errornão é subclasse deException, 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