PHP中的Try/Catch块未捕获异常

PHP中的Try/Catch块未捕获异常,php,Php,我正在尝试运行此页面中的示例#1: 我使用的开发者环境是UniServer 3.5和php5.2.3我最初的想法是,您捕获/抛出的异常名称有一个拼写错误,但是如果您的代码完全相同,我不确定到底发生了什么 尝试对原始脚本进行以下修改,并粘贴结果。这将有助于更好地诊断您的问题 <?php //set up exception handler to report what we didn't catch function exception_handler($exception) {

我正在尝试运行此页面中的示例#1:


我使用的开发者环境是
UniServer 3.5
php5.2.3

我最初的想法是,您捕获/抛出的异常名称有一个拼写错误,但是如果您的代码完全相同,我不确定到底发生了什么

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

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

是否可以尝试禁用您可能已安装的某些第三方扩展?

我在以下配置中遇到了同样的问题

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 使用eAcceleratorv0.9.5.1,版权所有(c)2004-2006 eAccelerator,作者:eAccelerator

解决方案是禁用或更新eAccelerator。我尝试了这两种方法,两种修复都成功了。这里报告了这个错误(注意,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
使用eAcceleratorv0.9.6.1,版权所有(c)2004-2010 eAccelerator,由eAccelerator创建,我遇到了一个确切的问题,似乎我甚至复制了异常的名称,但它没有捕获它。结果证明这是我愚蠢的错误,但我想我应该把我的案件张贴在这里,以防有其他人处于同样的情况


我的命名空间中有一个名为A的异常,脚本位于名为B的命名空间中。问题是我有一个\MyException,它等于(在PHP中)\B\A\MyException(因为我的脚本位于名为B的命名空间中!)。我所要做的就是在异常名称中添加反斜杠(或任何它的名称),使其看起来像:\A\MyException

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

如果您这样做:

try{
    //division by zero
    $number = 5/0;
}
catch(Exception $ex){
    echo 'Got it!';
}
你不会看到“明白了!”信息永远不会。为什么?这只是因为PHP总是需要“抛出”异常。您需要设置自己的错误处理程序并引发异常


请参阅设置错误处理程序函数:

在Xdebug中有一个设置:

xdebug.show_exception_trace = 1
这将迫使php即使在try-catch块中也输出异常。
把这个问题转到
0

很老的问题,但是

我也有这个问题(我就是这样找到这篇文章的),但仅仅是一个简单的实验就让我找到了解决办法。只需尝试将
异常
更改为
\Exception
。为我工作

编辑:


正如sivann在评论中指出的,使用名称空间应该做同样的事情。所以简单地说,
use\Exception作为异常在类声明之前。

尝试放置
捕获(\Exception$e)
而不是
捕获(Exception$e)
。如果您使用的是您不太熟悉的代码,或者——特别是——如果您使用的是框架,它可能会用自己的一个异常覆盖默认的PHP异常,因此您可能会走错路径并得到不想要的结果。如果您只是放置了
\Exception
,那么您肯定捕获了基本的PHP异常。

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

我需要用try{}catch(Throwable$e){}替换try{}catch(Exception$e){}


有关更多信息:

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

TLDR;确保您有
使用异常
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());
}

它可以工作。

在php中捕获所有异常

 try
 {
   //place code
   throw new Exception('foo');//eg
 }
  catch (\Throwable $e) 
 { 
   dd('for php 7');
 } catch (\Exception $e) 
 { 
    dd('for php 5');
 }

您能给我们看一下您的代码吗?要获得此错误,您唯一可以做的错误是捕获错误的异常(或无异常)。代码完全相同(我刚刚添加了一些换行符)。。。无论如何,我再次将代码复制到一个测试文件中,下面是相同的错误消息:0.2致命错误:未捕获异常“exception”,消息为“除零”。在W:\www\test.php:4堆栈跟踪:#0 W:\www\test.php(11):反向(0)#1{main}中,在第4行的W:\www\test.php中,我真的不知道那里发生了什么。。。可能是错误的PHP配置?一些旧的扩展版本导致异常处理问题。5.2.3是旧的,错误背后可能有缺陷。你能升级PHP吗?考虑到当前的生产版本是5.5,UniServer3.5也相当旧。3.5是打字错误吗?看看UniServer发布信息(),3.5显然不是打字错误。升级到UniServer 5.5并重试示例代码。outis,谢谢提示:)。这就是我当时做的-切换到XAMPP(不喜欢新版本的UniServer)。3.5不是一个拼写错误,但是服务器对我来说工作得非常好,所以我从来没有费心升级它。这不一样;)你需要自己抛出一个异常,我就是这么说的(是的,但怎么会不一样呢?这个链接已经死了,但我发现这很有用:在PHP版本7.3.9中,
$number=5/0;
不会引发异常。
$number
被设置为
INF
。非常感谢您发布此链接,因为我会在几天内没有意识到我的错误。这解决了我的问题,一个简单的懒汉。)命名空间代码中的catch块应该是
catch(\Exception$e)
。如果没有反斜杠,则
Exception
是特定于命名空间的,不会被匹配(或捕获)。感谢您发布此消息,我刚刚花了几个小时疯狂地思考我的catch块为什么不工作。facepalm少校。干杯!挽救了我的一天(和神经元…)@albanx这不是公认的answ
try
{
  $number = 5/0; //or other exception
}
catch(Exception $e)
{
  throw new Exception($e->getMessage(),$e->getCode());
}
 try
 {
   //place code
   throw new Exception('foo');//eg
 }
  catch (\Throwable $e) 
 { 
   dd('for php 7');
 } catch (\Exception $e) 
 { 
    dd('for php 5');
 }