【问题标题】:php exceptions - throw/catch not working across loopsphp异常-抛出/捕获不能跨循环工作
【发布时间】:2012-01-10 01:33:31
【问题描述】:

这应该可以。请告诉我我做错了什么。

代码如下:

<?php
try {
  echo "start";
  throw new Exception("test");
  for ($index=0; $index < 1; $index++) {
    echo "loop";
  }
} catch ( Exception $e ){
  echo "caught $e";
}
?>

我遇到了一个未捕获的异常,如果我将 throw 移到循环内它可以正常工作,但这违背了我的目的。我可以在单独的 try/catch 块中破解,但那是 hackish。

我已经在 5.2.13 和 5.2.17 服务器上尝试过。当前生产是 5.2.17,不,我还没有在 5.3.8 上测试它,因为我必须和我的主机一起升级,并重新测试很多代码。

有爱吗?

附: 我确实知道异常和未捕获异常之间的区别。但结果如下:

start
Fatal error: Uncaught exception 'Exception' with message 'test' in C:\UniServer\www\admin\water_ws\test.php:4 Stack trace: #0 {main} thrown in C:\UniServer\www\admin\water_ws\test.php on line 4

【问题讨论】:

  • 似乎在viper7 (5.2.15RC3-dev)codepad (5.2.5) 上表现不错……你确定这里没有其他东西在起作用吗?您echo $e(将异常转换为字符串)显示与未捕获案例类似的输出这一事实可能无济于事。
  • 你能详细说明它是如何不工作的吗?它是打印“循环”而不是“捕获测试”吗?
  • OP 建议都不建议(未捕获的异常);但我认为caught $e 看起来很像Fatal error: Uncaught $e
  • 您是否有启用 eAccelerator 的机会? It 和其他操作码缓存经常存在有据可查的异常问题。
  • cbuckley - 不,我不确定是不是有别的东西在起作用,这是那些闻起来不对劲的 wtf 错误之一。但是将 Exception 转换为字符串是一条红鲱鱼。

标签: php exception-handling php-5.2


【解决方案1】:

正如landons 所建议的,是eAccelerator 的“优化”优化了我的catch block。一旦我禁用了 eAccelerator,它就会按预期工作。

【讨论】:

    【解决方案2】:

    为什么要回显$e 对象? 试试这个:

    try {
        throw new Exception("test");
        for ($index=0; $index < 1; $index++) {
            echo "loop";
        }
    } catch ( Exception $e ){
        echo $e->getMessage();
    }
    

    【讨论】:

    • echo $e; 将调用Exception 类的__toString() 方法,该方法将返回抛出异常的漂亮摘要。
    猜你喜欢
    • 2016-02-17
    • 2013-06-24
    • 1970-01-01
    • 2019-05-10
    • 2020-10-03
    • 1970-01-01
    • 2016-10-27
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多