PHP中的Try/Catch块未捕获异常
我正在尝试运行此页面中的示例#1: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) {
我使用的开发者环境是
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而不是ExceptionTLDR;确保您有使用异常在这两个php文件的顶部,我也遇到了这种情况。我阅读了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());
}
它可以工作。在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');
}