Teste / bloco de captura em PHP não apanhando Exceção

Estou tentando executar este Exemplo # 1 desta página: http://php.net/manual/en/language.exceptions.php

getMessage(), "\n"; } // Continue execution echo "Hello World\n"; ?> 

No entanto, em vez da saída desejada, eu obtenho:

 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 do desenvolvedor que estou usando é UniServer 3.5 com PHP 5.2.3

Eu apenas tive esse problema exato onde parecia que eu até copiei o nome da exceção e, no entanto, não conseguiu. Aconteceu que foi meu erro estúpido, mas pensei que deveria enviar meu caso aqui caso houvesse alguém na mesma situação.

Eu tive minha exceção no meu namespace chamado A e o 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 o que eu tinha que fazer para consertar isso era adicionar uma barra invertida (ou seja o que for que for chamado) para o nome da exceção, então ficaria assim: \ A \ MyException

Pergunta muito antiga, ainda …

Eu também tive esse problema (e é assim que eu encontrei esta publicação), mas apenas um experimento simples me permitiu encontrar a solução. Apenas tente alterar Exception para \Exception . Trabalhou por mim!

EDITAR:

Como sivann apontou nos comentários, o uso do namespace deve fazer o mesmo. Então, simplesmente use \Exception as Exception; antes da declaração da sua class.

Você não pode usar o típico try {} catch {} blocos em PHP como você poderia fazer em outro idioma como C # (Csharp).

Se você fizer isto:

 try{ //division by zero $number = 5/0; } catch(Exception $ex){ echo 'Got it!'; } 

Você não verá o ‘Got it!’ mensagem nunca. Por quê? É apenas porque o PHP sempre precisa de uma Exceção para ser “Jogado”. Você precisa configurar seu próprio manipulador de erros e lançar uma Exceção com ele.

Veja a function set_error_handler : http://php.net/manual/es/function.set-error-handler.php

Tente colocar catch(\Exception $e) vez de catch(Exception $e) . Se você estiver usando um código que você não conhece muito bem ou, especialmente – se você estiver usando uma estrutura, pode replace a Expectativa padrão do PHP por uma própria, e, portanto, você pode ir para o caminho errado e obter o resultado indesejado. Se você acabou de colocar \Exception , então você tem certeza de que está pegando a exceção PHP básica.

Você não está executando o código idêntico, caso contrário, a exceção seria acionada na linha 4 em vez de 7. Que código você está executando exatamente?

Minha inicial, porém, você tem um erro de digitação em nome da exceção que você está pegando / jogando, mas se seu código é exatamente o mesmo, não tenho certeza exatamente o que está acontecendo.

Experimente a seguinte modificação do script original e cole seus resultados. Isso ajudará a diagnosticar seu problema um pouco melhor.

 < ?php //set up exception handler to report what we didn't catch function exception_handler($exception) { if($exception instanceof MyException) { echo "you didn't catch a myexception instance\n"; } else if($exception instanceof Exception) { echo "you didn't catch a exception instance\n"; } else { echo "uncaught exception of type: ".gettype($exception)."\n"; } echo "Uncaught exception: " , $exception->getMessage(), "\n"; } //install the handler set_exception_handler('exception_handler'); class MyException extends Exception { } function inverse($x) { if (!$x) { throw new MyException('Division by zero.'); } else return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (MyException $e) { echo 'Caught myexception: ', $e->getMessage(), "\n"; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } // Continue execution echo 'Hello World'; ?> 

Eu tive o mesmo problema com as seguintes configurações,

PHP 5.2.14 (cli) (construído: 12 de agosto de 2010 17:32:30) Copyright (c) 1997-2010 O Grupo PHP 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. Eu tentei os dois e as duas correções funcionaram. O bug é relatado aqui https://eaccelerator.net/ticket/242 (NB. Firefox reclama sobre seu cert SSL).

Agora estou correndo tentando pegar corretamente com as seguintes configurações,

PHP 5.2.4 (cli) (construído: 16 de outubro de 2007 09:13:35) Copyright (c) 1997-2007 O Grupo PHP Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies com eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, por eAccelerator

no Xdebug há uma configuração:

 xdebug.show_exception_trace = 1 

Isso forçará a php a exportar exceções, mesmo em um bloco try catch. Gire isso para 0

Talvez tente desabilitar certas extensões de terceiros que você possa ter instalado? http://bugs.php.net/bug.php?id=41744