Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou estudando tratamento de exceções e estou fazendo testes com função definida pelo usuário, assim, quando uma exceção for lançada e não houver um catch para tratar, não da Fatal error.
O problema: Se a exceção for tratada na função definida pelo usuário, o script não continua a sua execução, ele para como um exit() no final da função definida pelo usuário.
EXEMPLO 1
Exemplo simples para entender
<?php
//seta função para pegar exceções não tratadas em try/catch
set_exception_handler("pegaExcecapSemTratamento");
//função definida pelo usuário para pegar exceções não tratadas
function pegaExcecapSemTratamento($e)
{
echo 'Exceção pega sem tratamento:</br>', $e->getMessage(), '</br></br></br>';
}
//extensões das exceções para usar na aplicação
class MyException extends Exception {}
class My2Exception extends Exception {}
class My3Exception extends Exception {}
class Teste
{
public function __construct()
{
throw new My3Exception("You caught me!");
}
}
try
{
//irá executar função pegaExcecapSemTratamento(), pois não houve tratamento adequado nos catch
new Teste();
} echo $e->getMessage(), ' MyException';
} echo $e->getMessage(), ' My2Exception';
}
echo("continua executando a aplicação");
?>
EXEMPLO 2
Agora um exemplo convencional de tratamento de exceção
<?php
set_exception_handler("pegaExcecapSemTratamento");
//função definida pelo usuário para pegar exceções não tratadas
function pegaExcecapSemTratamento($e)
{
echo 'Exceção pega sem tratamento:</br>', $e->getMessage(), '</br></br></br>';
}
//extensões das exceções para usar na aplicação
class MyException extends Exception {}
class My2Exception extends Exception {}
class My3Exception extends Exception {}
class Teste
{
public function __construct()
{
throw new My3Exception("You caught me!");
}
}
try
{
//irá executar o catch correto e não vai travar o script
new Teste();
} echo $e->getMessage(), ' MyException';
} echo $e->getMessage(), ' My2Exception';
} echo $e->getMessage(), ' My2Exception';
}
echo("continua executando a aplicação");
?>
No exemplo 1, a mensagem dada com echo no final do script não foi executada, ou seja, no meu ver, a função definida para tratamento de exeções teve um exit() no final.
Agora no exemplo 2, o script continuou a executar (o echo no final do script foi executado).
Por que quando passa pela função definida pelo usuário (no caso aqui a pegaExcecapSemTratamento()) ela não continua a execução do script, porém, no caso de exceções pegas com catch, a execução do script continua normalmente?
Alguém pode ajudar?
>
:seta: http://php.net/manual/en/function.set-exception-handler.php
Entenda que uma exceção é um erro grave, o script não pode continuar caso uma seja lançada. Mesmo que você defina um handler específico, ela ainda não deixou de existir.
TODAS AS EXCEÇÕES devem ser pegas, sem exceção (:mellow: é, soou estranho mesmo, mas essa é a ideia)
Concordo que todas as exceções devem ser pegas, esse é o objetivo de ter criado um throw. A dúvida acima é apenas para estudo das Exceptions do PHP, gosto de explanar bem o assunto mesmo não pensando em usar a função pré-definida.
Quando você disse o script não pode continuar, você se refere ao contexto onde foi lançado o throw? No caso do exemplo 2, o contexto seria a classe Teste, essa deixa de funcionar, porém, a página como um todo pode continuar sem problema. Não é mesmo?
Por exemplo, se tivermos uma página que usa duas classes que podem lançar exceções, ao carregar a página e uma das classes lança um exceção e a outra não, a nossa página pode continuar carregando talvez para exibir os dados da classe 2. Neste caso, o script (classe que lançou a exceção, para), mas a página continua a ser carregada e pode exibir os dados da classe2 que não lançou exceção. Neste exemplo, imaginemos que a página não depende do sucesso das duas classes, uma carregando já é suficiente.
Não é isso?
Quando você disse o script não pode continuar, você se refere ao contexto onde foi lançado o throw? No caso do exemplo 2, o contexto seria a classe Teste, essa deixa de funcionar, porém, a página como um todo pode continuar sem problema. Não é mesmo?
Não!
Uma exceção não pega indica uma falha GERAL do sistema, é um FATAL ERROR... Como todo fatal error em PHP, o script TODO para... Certas linguagens, como o Java nem deixa você lançar exceções sem pegá-las ou informar quais exceções são lançadas. Em algum ponto você vai ter que pegar...
Tenta dividir por 0 em algum lugar do seu script e vai ver que dá pau em tudo, porque um erro desse tipo pode afetar todo o sistema, ocasionando perda de dados ou estouros de memória.
>
Não!
Uma exceção não pega indica uma falha GERAL do sistema, é um FATAL ERROR... Como todo fatal error em PHP, o script TODO para... Certas linguagens, como o Java nem deixa você lançar exceções sem pegá-las ou informar quais exceções são lançadas. Em algum ponto você vai ter que pegar...
Tenta dividir por 0 em algum lugar do seu script e vai ver que dá pau em tudo, porque um erro desse tipo pode afetar todo o sistema, ocasionando perda de dados ou estouros de memória.
Entendi, exceções não pega com try/catch gera um fatal error. Mas quando ela é pega, como o exemplo 2, a página continua executando, não é mesmo? Ai não gerou um fatal error, porque foi tratado a exceção. Essa foi a minha dúvida na pergunta anterior. Pelo sua última resposta, eu entendi que exceção não pega, gera fatal error. Só estou com dúvida agora se quando a exceção é pega, a execução da página continua sem gerar fatal error? Pelo exemplo, acredito que sim, não gera fatal error e a página continua seu processo.
Sim, essa é a ideia.
Se a exceção foi pega e tratada, significa que o script pode continuar...
>
Sim, essa é a ideia.
Se a exceção foi pega e tratada, significa que o script pode continuar...
Entendi. Maravilha Henrique, obrigado pela ajuda.
:seta: http://php.net/manual/en/function.set-exception-handler.php
Entenda que uma exceção é um erro grave, o script não pode continuar caso uma seja lançada. Mesmo que você defina um handler específico, ela ainda não deixou de existir.
TODAS AS EXCEÇÕES devem ser pegas, sem exceção (:mellow: é, soou estranho mesmo, mas essa é a ideia)