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

Kra*_*ssi 90 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";
?>
Run Code Online (Sandbox Code Playgroud)

然而,我得到的不是所需的输出:

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
Run Code Online (Sandbox Code Playgroud)

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

Pij*_*usn 206

我只是遇到了这个确切的问题,似乎我甚至复制了异常的名称,但它没有抓住它.事实证明这是我的愚蠢错误,但我认为我应该在这里发布我的案子,以防有其他人处于相同的情况.

我在名为A的名称空间中有异常,脚本位于名为B的名称空间中.问题是我有一个A\MyException等于(在PHP中)\ B\A\MyException(因为我的脚本在名为B的命名空间中!).我需要做的就是修改它的反斜杠(或者它所谓的任何东西)到异常名称,所以它看起来像这样:\ A\MyException

  • 这解决了我的问题,命名空间代码中的一个简单的懒惰catch块应该是`catch(\ Exception $ e)`.没有反斜杠`Exception`特定于命名空间,不会匹配(或捕获). (75认同)
  • 非常感谢你发布这个,因为我会在几天没有意识到我的错误. (6认同)
  • 感谢您发布此内容! (3认同)
  • 干杯! 救了我的一天(和神经元......):) (3认同)
  • 感谢您发布此消息,我刚刚花了几个小时疯狂了解为什么我的catch块没有工作.主要的facepalm. (2认同)
  • @albanx这不是公认的答案,因为它显然不是OP的问题.名称空间在他的代码中匹配.人们只是赞同这个答案,因为它可能导致类似的问题,但这不是正确的问题. (2认同)

Ene*_*ion 60

相当古老的问题,但......

我也有这个问题(这就是我发现这篇文章的方式),但只是简单的实验让我找到了解决方案.刚刚尝试改变Exception\Exception.为我工作!

编辑:

正如sivann在评论中指出的那样,使用命名空间应该做同样的事情.所以简单地use \Exception as Exception;在你的课堂宣言之前.


Vla*_*vic 30

试着catch(\Exception $e)代替catch(Exception $e).如果你正在使用一个你不太了解的代码,或者 - 尤其是 - 如果你正在使用一个框架,它可能会覆盖它自己的一个默认的PHP Exception,因此你可能会走错路径并获得不希望的结果.如果您只是放\Exception,那么您确定您正在捕获基本的PHP异常.

  • 这对我来说 (2认同)

Row*_*ego 19

你不能像在C#(Csharp)这样的另一种语言中使用PHP中的典型try {} catch {}块.

如果你这样做:

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

你不会看到'得到它'!永远的消息.为什么?这只是因为PHP总是需要一个Exception才能被"抛出".您需要设置自己的错误处理程序并使用它抛出异常.

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

  • 这是不一样的;)你需要自己抛出一个异常,这就是我所说的(<<这只是因为PHP总是需要一个Exception才能被"抛出">>)@JaredFarrish (6认同)

小智 12

\Exception 对我不起作用,但我找到了解决方案。

我需要更换:

  try {
   ...
  } catch(Exception $e){
   ...
  } 
Run Code Online (Sandbox Code Playgroud)

经过

  try {
   ...
  } catch(Throwable $e){
   ...
  }.
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息:https : //trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/


use*_*384 9

如果您使用的是 PHP 7,您可能需要 Throwable 而不是 Exception

  • 解释是PHP7使用Throwable而不是Exception。这个讨论是我遇到问题时发现的第一个讨论,我想做出贡献。诸如此类的评论是 Stack 对社区不友好的原因。 (5认同)
  • 我无意冒犯你。这篇文章出现在“第一篇文章”评论队列中,在我看来,针对一个相当老的问题发布答案是没有用的。在撰写本文时,PHP 世界中甚至还没有发明 Question Throwable。如果您在答案中写下 Throwable 是由异常(和错误)实现的接口,因此也可以被捕获,这将会很有帮助。但它并不是对异常的补充。 (2认同)

小智 6

我的初期是你在捕捉/抛出的异常名称中有一个拼写错误,但如果你的代码完全一样,我不确定到底发生了什么.

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

<?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';
?>
Run Code Online (Sandbox Code Playgroud)