2012-03-17 144 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