2012-03-17 139 views
1

我需要將一個PHP異常對象存儲在mysql列中。它用於離線錯誤記錄系統。通常我只想serialize()異常對象,並用它做的,但一半的時間,試圖做到這一點的時候,我得到以下錯誤:在數據庫中存儲PHP異常對象

Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'

我不知道如何得到這個工作始終。任何對此問題有回答的人,我將不勝感激。

謝謝。

回答

0

http://php.net/manual/en/function.set-error-handler.php

這裏的全局錯誤處理程序定義的功能。您可以定義一個全局錯誤處理程序,並將錯誤描述寫入數據庫。

和異常類的結構:

http://php.net/manual/en/class.exception.php

+0

感謝您的回覆。然而這不是我問的。我很清楚如何構建一個錯誤處理框架。我特別要求將一個異常和_all_它的數據轉換成一個可以存在於數據庫中的可行構造。 – Spot 2012-03-17 06:30:38

+0

你有沒有嘗試Exception e.toString();看這裏:http://php.net/manual/en/class.exception.php – 2012-03-17 06:34:08

4

異常對象要記錄包含Closure類,PHP的執行anonymous functions and closure的一個實例。顯然匿名函數不能被序列化。

你需要調查你的異常類,看看它們是否應該包含它們。通常情況下,異常類不應該有一個匿名函數作爲屬性。

這再現了同樣的錯誤信息爲您的情況:

$exception = new Exception('BOO'); 
$anonymousFunction = function() { echo 'blah'; }; 
$exception->anonymousFunction = $anonymousFunction; 
serialize($exception); 

所以通過您的代碼,你的框架代碼,你的庫代碼挖掘,並嘗試找出異常類確實有一個匿名的功能一流的財產,誰分配他們,爲什麼 - 然後你應該能夠爲它創建一個特殊的情況。

希望這會有所幫助。

+1

閉包可能存儲在例外回溯,即。當一個匿名函數中引發異常時。 – 2014-04-16 09:00:48

+1

更具體地說,向堆棧中的函數提供的*參數*之一是閉包 - 直接調用閉包只會導致字符串「{閉包}」作爲函數名稱。 – IMSoP 2015-03-23 11:40:09