在PHP中尝试/捕获块不捕获异常

时间:2010-01-31 18:09:04

标签: php

我正在尝试从此页面运行此示例#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

13 个答案:

答案 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中有一个设置:

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');
 }

https://www.php.net/manual/en/language.exceptions.php

答案 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/