Estou tentando executar este Exemplo # 1 desta página: http://php.net/manual/en/idioma.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
No entanto, em vez da saída desejada, recebo:
0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.'
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7
O ambiente de desenvolvedor que estou usando está UniServer 3.5
comPHP 5.2.3
Respostas:
Eu simplesmente tive esse problema exato em que parecia que eu tinha até copiado o nome da exceção e ainda assim não o pegou. Acontece que foi um erro estúpido, mas achei que deveria postar meu caso aqui caso haja outra pessoa na mesma situação.
Eu tive a minha exceção em meu namespace chamado A eo script estava em um namespace chamado B . O problema era que eu tinha A \ MyException que é igual (em PHP) \ B \ A \ MyException (porque meu script está no namespace chamado B !). Tudo que tive que fazer para consertar foi adicionar barra invertida (ou o que quer que seja chamado) ao nome da exceção para que ficasse assim: \ A \ MyException
fonte
catch (\Exception $e)
. Sem a barra invertidaException
é específico para o namespace e não será correspondido (ou capturado).Uma pergunta bem velha, ainda ...
Eu também tive esse problema (e foi assim que encontrei este post), mas apenas uma simples experiência me permitiu encontrar a solução. Tente mudar
Exception
para\Exception
. Funcionou para mim!EDITAR:
Como sivann apontou nos comentários, o uso de namespace deve fazer a mesma coisa. Então, simplesmente coloque
use \Exception as Exception;
antes de sua declaração de classe.fonte
use Exception;
deve fazê-loTente colocar em
catch(\Exception $e)
vez decatch(Exception $e)
. Se você estiver usando um código que não conhece muito bem, ou - especialmente - se estiver usando um framework, ele pode substituir a exceção PHP padrão por uma própria e, portanto, você pode ir para o caminho errado e obter o resultado indesejado. Se você acabou de colocar\Exception
, tem certeza de que está capturando a exceção básica do PHP.fonte
Você não pode usar os blocos típicos try {} catch {} em PHP como faria em outra linguagem como C # (Csharp).
Se você fizer isto:
Você não verá a mensagem 'Entendi!' mensagem nunca. Por quê? É porque o PHP sempre precisa que uma exceção seja "lançada". Você precisa definir seu próprio manipulador de erros e lançar uma exceção com ele.
Veja a função set_error_handler : http://php.net/manual/es/function.set-error-handler.php
fonte
$number = 5/0;
não gera uma exceção.$number
está definido para serINF
.Minha inicial, porém, é que você tem um erro de digitação no nome da exceção que está capturando / lançando, mas se o seu código for exatamente o mesmo, não tenho certeza do que exatamente está acontecendo.
Tente a seguinte modificação do script original e cole os resultados. Isso ajudará a diagnosticar seu problema um pouco melhor.
fonte
Eu tive o mesmo problema com as configurações a seguir,
PHP 5.2.14 (cli) (construído: 12 de agosto de 2010 17:32:30) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies com eAccelerator v0.9.5. 1 , Copyright (c) 2004-2006 eAccelerator, por eAccelerator
A solução é desativar o eAccelerator ou atualizá-lo. Tentei ambos e as duas correções funcionaram. O bug é relatado aqui https://eaccelerator.net/ticket/242 (NB. Firefox reclama sobre seu certificado SSL).
Agora estou executando o try catch corretamente com as seguintes configurações,
PHP 5.2.4 (cli) (construído em: 16 de outubro de 2007 09:13:35) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies com eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, por eAccelerator
fonte
\ Exception não funciona para mim, mas encontrei uma solução.
Eu precisava substituir try {} catch (Exception $ e) {} por try {} catch (Throwable $ e) {}.
Para mais informações: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
fonte
no Xdebug, há uma configuração:
Isso forçará o php a gerar exceções, mesmo em um bloco try catch. Transforme isso para
0
fonte
Se você estiver usando o PHP 7, você pode precisar do Throwable em vez do Exception
fonte
Talvez tente desativar certas extensões de terceiros que você possa ter instalado? http://bugs.php.net/bug.php?id=41744
fonte
TLDR; certifique-se de ter
use Exception;
no topo de ambos os arquivos phpfonte
Eu também estou experimentando isso. Eu li o comentário de Rowinson Gallego que afirmava que a exceção deve ser lançada. Então, modifiquei meu código de:
para dentro :
Funciona.
fonte