2015-10-22 138 views
0

我试图调试一个失败的PHP脚本。PHP吞咽异常

我发现引发异常的位置,但是该进程在可以被捕获之前退出。

我已经添加了两个try-catch块。周围的代码来自Magento。

class Varien_Image { 
    function __construct($fileName=null, $adapter=Varien_Image_Adapter::ADAPTER_GD2) 
    { 
     try { 
      $this->_getAdapter($adapter); 
      $this->_fileName = $fileName; 
      if (isset($fileName)) { 
       $this->open(); // throws here from a few frames deeper 
      } 
     } catch(Exception $e) { 
      echo "WE DO GET HERE\n"; 
      throw $e; 
     } 
    } 
    //... 
} 

class Mage_Catalog_Model_Product_Image ... { 
    //... 
    public function getImageProcessor() { 
     //... 
     try { 
      echo "START\n"; 
      $this->_processor = new Varien_Image($this->getBaseFile()); 
     } catch(Exception $e) { 
      echo "BUT WE NEVER GET HERE - THE PROCESS EXITS INSTEAD\n"; 
     } 
     //... 
    } 
    //... 
} 

输出是

START 
WE DO GET HERE 

为什么会异常被吞噬或导致进程死吗?

编辑

它退出时的状态码255

通过使用strace运行:

write(1, "WE DO GET HERE\n", 15WE DO GET HERE 
)  = 15 
write(3, "\1\0\0\0\1", 5)    = 5 
shutdown(3, SHUT_RDWR)     = 0 
close(3)        = 0 
munmap(0x7f254d9f3000, 151552)   = 0 
close(2)        = 0 
close(1)        = 0 
munmap(0x7f254da1f000, 4096)   = 0 
close(0)        = 0 
munmap(0x7f254da20000, 4096)   = 0 
munmap(0x7f2548d95000, 266240)   = 0 
munmap(0x7f2548d54000, 266240)   = 0 
munmap(0x7f2548c91000, 266240)   = 0 
brk(0x691f000)       = 0x691f000 
brk(0x679f000)       = 0x679f000 
brk(0x641e000)       = 0x641e000 
brk(0x5b9e000)       = 0x5b9e000 
brk(0x4f5e000)       = 0x4f5e000 
brk(0x4dde000)       = 0x4dde000 
brk(0x4c5e000)       = 0x4c5e000 
brk(0x4ade000)       = 0x4ade000 
brk(0x47de000)       = 0x47de000 
brk(0x465e000)       = 0x465e000 
brk(0x439e000)       = 0x439e000 
brk(0x3e9e000)       = 0x3e9e000 
brk(0x3813000)       = 0x3813000 
brk(0x3693000)       = 0x3693000 
brk(0x3513000)       = 0x3513000 
brk(0x3393000)       = 0x3393000 
munmap(0x7f2548c50000, 266240)   = 0 
munmap(0x7f2548cd2000, 266240)   = 0 
munmap(0x7f2548d13000, 266240)   = 0 
munmap(0x7f2548dd6000, 266240)   = 0 
munmap(0x7f2549e93000, 2126744)   = 0 
munmap(0x7f2549c63000, 2293440)   = 0 
munmap(0x7f2549a3a000, 2264288)   = 0 
munmap(0x7f254a09b000, 2131176)   = 0 
munmap(0x7f254a2a4000, 2247424)   = 0 
munmap(0x7f254aa01000, 2151656)   = 0 
munmap(0x7f254a4c9000, 5471824)   = 0 
munmap(0x7f254ac0f000, 2164040)   = 0 
munmap(0x7f254ae20000, 2209936)   = 0 
munmap(0x7f254b03c000, 2267912)   = 0 
brk(0x2c3a000)       = 0x2c3a000 
munmap(0x7f254d89e000, 1052672)   = 0 
munmap(0x7f254d99f000, 266240)   = 0 
munmap(0x7f254d84f000, 323584)   = 0 
exit_group(255)       = ? 
+++ exited with 255 +++ 

它立即呼应 '我们得到HERE',然后开始关机。 fd 3上的SHUTDOWN是数据库的套接字。

回答

1

您遇到未报告的解析错误,请阅读此问题的详细信息: Parse errors are not displayed

但是基本的答案是你需要将以下添加到您的php.ini

error_reporting = E_ALL | E_STRICT 

而且,你的实际语法错误就在这一行上。您需要结束;

 echo "START\n" 
+0

感谢您的回答。我不认为就是这样。我确实有你所建议的error_reporting设置。缺少的分号是编写问题时出现的错误。我会解决这个问题。 – Joel

+0

在'Varien_Image'逻辑的某个地方是否有任何'die;'命令? –

+0

没有。除非我丢失了某些东西,否则在throw之后运行的下一行应该是echo语句。 – Joel

0

我见过类似这样的东西,虽然在PHP中不同的上下文。在CentOS 6.7 PHP 5.3中,存在一个bug,即https URL的cURL将简单地终止该程序。没有错误会被抛出,所以你可以尝试追赶,直到你脸上发出蓝光,它永远不会给你一个友好的错误信息。

(你可以在这里读到它,如果你有兴趣: https://www.centos.org/forums/viewtopic.php?t=57970 https://bugzilla.redhat.com/show_bug.cgi?id=1249426

我不建议这又有什么,直接做每一个现在,你的问题比其他事实,一个图书馆 - 即使像cURL这样值得信赖的图书馆也会有一个糟糕的运行时间错误。我经过详细的详细记录后才发现这一点。我意识到这个问题已经过去了一年,但是希望我的尾巴能够帮助别人处理像你所描述的那种“忍者”错误。