我正在尝试从此页面运行此示例#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
我使用的开发人员环境是UniServer 3.5
PHP 5.2.3
答案 0 :(得分:194)
我刚才遇到了这个确切的问题,似乎我甚至已经复制了异常的名称但却没有抓住它。事实证明这是我的愚蠢错误,但我认为我应该在这里发布我的案子以防其他人处于相同的情况。
我在名为 A 的名称空间中出现异常,脚本位于名为 B 的名称空间中。问题是我有 A \ MyException 等于(在PHP中) \ B \ A \ MyException (因为我的脚本位于名为 B的名称空间中!)。我需要做的就是修复它的反斜杠(或者它所谓的任何东西)到异常名称,所以它看起来像这样: \ A \ MyException
答案 1 :(得分:48)
相当陈旧的问题,但是......
我也有这个问题(这就是我发现这篇文章的方式)但只是简单的实验让我找到了解决方案。只需尝试将Exception
更改为\Exception
即可。为我工作!
修改强>
正如sivann在评论中指出的那样,使用命名空间应该做同样的事情。所以只需在课堂声明之前加上use \Exception as Exception;
。
答案 2 :(得分:25)
尝试放置catch(\Exception $e)
而不是catch(Exception $e)
。如果您使用的代码不是很清楚,或者 - 尤其是 - 如果您使用的是框架,它可能会覆盖默认的PHP异常,因此您可能会走错路径并得到不希望的结果。如果您只是放\Exception
,那么您确定要捕获基本的PHP异常。
答案 3 :(得分:20)
你不能像在C#(Csharp)这样的另一种语言中使用PHP中的典型try {} catch {}块。
如果你这样做:
try{
//division by zero
$number = 5/0;
}
catch(Exception $ex){
echo 'Got it!';
}
你不会看到'知道了!'永远的消息。为什么?这只是因为PHP总是需要一个Exception才能被“抛出”。您需要设置自己的错误处理程序并使用它抛出异常。
请参阅 set_error_handler 功能:http://php.net/manual/es/function.set-error-handler.php
答案 4 :(得分:5)
我的第一个问题是,你抓到/抛出的异常名称中有一个拼写错误,但如果你的代码完全相同,我不确定到底发生了什么。
尝试对原始脚本进行以下修改,然后粘贴结果。它有助于更好地诊断您的问题。
<?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';
?>
答案 5 :(得分:4)
以下配置存在同样的问题,
PHP 5.2.14(cli)(建于2010年8月12日17:32:30) 版权所有(c)1997-2010 PHP小组 Zend Engine v2.2.0,版权所有(c)1998-2010 Zend Technologies eAccelerator v0.9.5.1 ,版权所有(c)2004-2006 eAccelerator,eAccelerator
解决方案是禁用eAccelerator或更新它。我尝试了两种方法,并且两种方法都有效。此处报告了错误https://eaccelerator.net/ticket/242(注意:firefox抱怨他们的SSL证书)。
现在我正在使用以下配置运行try catch,
PHP 5.2.4(cli)(建于:2007年10月16日09:13:35) 版权所有(c)1997-2007 PHP小组 Zend Engine v2.2.0,版权所有(c)1998-2007 Zend Technologies eAccelerator v0.9.6.1 ,版权所有(c)2004-2010 eAccelerator,eAccelerator
答案 6 :(得分:3)
xdebug.show_exception_trace = 1
即使在try catch块中,这也会强制php输出异常。
将其转为0
答案 7 :(得分:3)
如果您使用的是PHP 7,则可能需要Throwable而不是Exception
答案 8 :(得分:3)
捕获php中的所有异常
try
{
//place code
throw new Exception('foo');//eg
}
catch (\Throwable $e)
{
dd('for php 7');
} catch (\Exception $e)
{
dd('for php 5');
}
答案 9 :(得分:2)
TLDR;确保两个PHP文件顶部都有use Exception;
答案 10 :(得分:1)
也许尝试禁用您可能安装的某些第三方扩展程序? http://bugs.php.net/bug.php?id=41744
答案 11 :(得分:1)
我也在经历这种情况。我读了Rowinson Gallego的评论,其中必须抛出异常。所以我从:
修改了我的代码try
{
$number = 5/0; //or other exception
}
catch(Exception $e)
{
throw $e;
}
进入:
try
{
$number = 5/0; //or other exception
}
catch(Exception $e)
{
throw new Exception($e->getMessage(),$e->getCode());
}
有效。
答案 12 :(得分:0)
\ Exception对我不起作用,但是我找到了解决方法。
我需要用try {} catch(Throwable $ e){}替换try {} catch(Exception $ e){}。
有关更多信息:https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/