2013-11-27 183 views
0

我使用set_exception_handler()在我的PhP程序中設置了一個異常處理程序,它實際上工作正常。從某種意義上說,它確實能夠捕獲我不能處理的異常,並且如處理程序中所提供的那樣,記錄異常詳細信息。那麼,我爲什麼抱怨?問題是,除了記錄與文件名,並在異常處理程序行數正確的細節,它也顯示在瀏覽器中以下消息:儘管被異常處理程序捕獲,PhP異常消息顯示

 Fatal error: Exception thrown without a stack frame in Unknown on line 0 

我的信念是,也許這個特定的異常消息是從哪裏來的stdout流,而處理程序捕獲的異常來自stderr流。另一種可能性是上述消息由錯誤處理程序模塊發出,而不是PhP的異常處理程序模塊。無論如何,我希望所有的異常消息都去一個處理程序。我也有一個錯誤處理程序設置如下:

set_error_handler('SS_error_handler', E_ALL); 

這種情況是如何處理的?致命錯誤消息是否來自PhP的錯誤消息報告模塊?如果是這樣,那麼異常處理程序和錯誤處理程序之間是否存在重疊,因爲它們在某些錯誤/異常時都會觸發?如果相關,我想補充說這個特定的異常是MySQL的PDO語句。

任何解釋將不勝感激。

回答

0

在導致錯誤的行開始處添加@字符,這會使其靜音。

,你也可以的ini_set( 'display_errors設置',0),將每個人都沉默:)

但通常人們只是try{} catch (e) { trigger_error(e, E_USER_ERROR);}

+1

有史以來最糟糕的建議! –

+0

等待,我有更多的建議,只是谷歌搜索)) – Benedictus

+2

現在它更糟糕...永遠不要壓制錯誤,總是記錄和分析它們! –

0

請參考文檔:http://php.net/manual/en/function.set-error-handler.php

以下錯誤類型不能用用戶定義的函數 函數處理:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING, E_COMPILE_ERROR,E_COMPILE_WARNING和大部分E_STRICT在中引發文件,其中調用set_error_handler()。

因此,您不能使用set_error_handler來捕捉異常,您應該使用正確的try { } catch { }塊。

+0

請仔細閱讀我的問題。第一行說我正在使用異常處理程序。如果你沒有明確地捕捉到表達式,那麼異常處理程序應該捕獲它並且它可以。問題是即使在處理異常之後,錯誤消息的來源是什麼?它來自PhP或錯誤處理模塊的異常處理模塊還是有其他解釋。 – Sam

+0

你是否在錯誤處理程序本身中引發異常? –

+0

看看這些幫助:http:// stackoverflow。com/questions/10485371/baffled-php-fatal-error-exception-thrown-without-a-stack-frame-in-unknown-on-l和http://stackoverflow.com/questions/14103727/preventing-exceptions-沒有堆棧幀,與錯誤的異常處理程序 - 關閉 –

相關問題