在PHP尝试/ Catch块不捕捉exception

我想从这个页面运行这个例子#1: http : //php.net/manual/en/language.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"; ?> 

然而,而不是我所期望的输出:

 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 

我使用的开发人员环境是使用PHP 5.2.3 UniServer 3.5

我只是有这个确切的问题,似乎我甚至复制了exception的名称,但它没有抓住它。 原来这是我的愚蠢的错误,但我认为我应该在这里发表我的情况,以防有其他人在同一情况下。

我在我的命名空间A中有例外,脚本在名为B的命名空间中。 问题是我有A \ MyException ,它等于(在PHP中) \ B \ A \ MyException (因为我的脚本在名为B !的名称空间中)。 我所需要做的就是将反斜杠(或者其他所谓的)添加到exception名称,所以它看起来像这样: \ A \ MyException

相当古老的问题,但…

我也有这个问题(这就是我发现这个post),但只是简单的实验让我find解决scheme。 只要尝试将Exception更改为\Exception 。 为我工作!

编辑:

正如sivann指出的那样,使用命名空间应该做同样的事情。 所以简单地把use \Exception as Exception; 在你的类声明之前。

你不能在PHP中使用典型的try {} catch {}块,就像在C#(Csharp)等其他语言中所做的那样。

如果你这样做:

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

你不会看到“得到它!” 消息从不。 为什么? 这只是因为PHP总是需要一个exception来“投掷”。 你需要设置你自己的error handling程序,并抛出一个Exception。

请参阅set_error_handler函数: http : //php.net/manual/es/function.set-error-handler.php

尝试把catch(\Exception $e)而不是catch(Exception $e) 。 如果你正在使用一个你不太了解的代码,或者 – 尤其是 – 如果你正在使用一个框架,它可能会用自己的代码来覆盖默认的PHPexception,因此你可能会去错误的path并得到不想要的结果。 如果你只是把\Exception ,那么你确定你正在捕捉基本的PHPexception。

您没有运行相同的代码,否则将在第4行而不是第7行引发exception。您准确运行哪些代码?

我最初的意思是你有一个input/输出exception的错字,但如果你的代码完全一样,我不确定到底发生了什么。

尝试对原始脚本进行以下修改,然后粘贴结果。 这将有助于更好地诊断您的问题。

 <?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'; ?> 

我有以下configuration相同的问题,

PHP 5.2.14(cli)(内置:2010年8月12日17:32:30)版权所有(c)1997-2010 PHP组Zend引擎v2.2.0,版权所有(c)1998-2010 Zend技术与eAccelerator v0.9.5。 1 ,版权所有(c)2004-2006 eAccelerator,由eAccelerator

解决方法是禁用eAccelerator或更新它。 我尝试了两个和两个修复工作。 这个bug报告在这里https://eaccelerator.net/ticket/242(NB。firefox抱怨他们的SSL证书)。;

现在我正在运行尝试正确捕捉以下configuration,

版权所有(c)1997-2007 PHP小组Zend引擎v2.2.0,版权所有(c)1998-2007 Zend Technologies与eAccelerator v0.9.6。 1 ,版权所有(c)2004-2010 eAccelerator,由eAccelerator

在Xdebug中有一个设置:

 xdebug.show_exception_trace = 1 

这将强制PHP甚至在try catch块中输出exception。 把这个变成0

也许尝试禁用您可能已经安装的某些第三方扩展? http://bugs.php.net/bug.php?id=41744