No exemplo anterior, utilizamos o comando throw para lançar uma exceção
explicitamente. Em alguns momentos, o tratamento da exceção não pode, por algum
motivo, ser tratada em seu respectivo bloco catch.
Nessa situação acima, podemos relançar uma exceção para um escopo
superior, para seu tratamento, utilizado o mesmo comando throw.
Sintaxe
try
{
//código
}
catch(tipo_excecao $nome_objeto)
{
throw $nome_objeto; //relançando exceção
}
Exemplo 5
<?php
function funcao1(){
funcao2();
}
function funcao2(){
funcao3();
}
function funcao3(){
try {
$var = 10/0;
}
catch(Exception $ex){
throw $ex;
}
}
try
{
funcao1();
}
catch(DivisionByZeroError $ex)
{
echo "__toString: ",$ex->__toString(),"\n";
}
?>
Saída
ERROR!
__toString: DivisionByZeroError: Division by zero in /tmp/exLM74wetK.php:11
Stack trace:
#0 /tmp/exLM74wetK.php(7): funcao3()
#1 /tmp/exLM74wetK.php(3): funcao2()
#2 /tmp/exLM74wetK.php(19): funcao1()
#3 {main}
Caso uma nova exceção seja lançada ou invés de relançada, as informações do stacktrace referentes ao
erro anterior serão perdidas, "mascarando" assim o erro.