2015-10-22 129 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這樣值得信賴的圖書館也會有一個糟糕的運行時間錯誤。我經過詳細的詳細記錄後才發現這一點。我意識到這個問題已經過去了一年,但是希望我的尾巴能夠幫助別人處理像你所描述的那種「忍者」錯誤。