2012-03-29 47 views
3

我的Flex应用程序使用本地SharedObjects。例如,由于插件崩溃,Flash cookie发生了一些事件。在这种情况下,SharedObjects.getLocal将引发异常(#2006)。Flex:从损坏的本地SharedObject中恢复

我的客户希望应用程序正常恢复:如果Cookie损坏,我应该用空的替换它。

问题是,如果SharedObject.getLocal没有返回SharedObject的实例,我没有什么可以调用clear()。

如何删除或替换此类cookie?

非常感谢!

编辑:

没有太多的代码显示 - 我访问本地的cookie,我可以轻松地捕获该异常。但是,一旦我发现异常,我怎样才能在同一位置创建一个新的共享对象?

try { 
    localStorage = SharedObject.getLocal("heywoodsApp"); 
} catch (err:Error) { 
     // what do I do here? 
} 

错误很容易通过用编辑器损坏Flash cookie的二进制内容来重现。

+0

+1的问题;但我不知道解决方案是什么。什么是你的应用程序做插件崩溃是司空见惯的?你能分享代码吗?你能分享完整的例外吗?我想知道是否可以使用uncaughtException事件来创建一个全新的SharedObject? – JeffryHouser 2012-03-29 13:42:37

+0

该应用程序是监控和分析公司内部使用的业务数据的前端。崩溃并不是很普遍,但是在Windows崩溃之后有一个损坏的cookie的报告,并且由于用户在技术上不够精通,无法清理他们的Flash cookies,所以客户已经提出了对功能的请求(即I如果我这样做,可以获得更多的钱),如果事件重复,应用会为他们做这件事。我将把代码放在原始评论中。 – 2012-03-29 14:24:19

+0

@ThomasHeywood你有没有解决这个问题?我在这里没有看到任何好的答案:/ – 2014-06-20 07:36:47

回答

0

您需要测试SharedObject的长度并重新创建它是否为0.此外,始终使用flush写入对象。下面是我们用来计算的时候,我们的软件推出数的函数:

private function usageNumber():void { 
    usage = SharedObject.getLocal("usage"); 

    if (usage.size > 0) { 
     var usageStr:String = usage.data.usage;  
     var usageNum:Number = parseInt(usageStr); 

     usageNum = usageNum + 1; 
     usageStr = usageNum.toString(); 

     usage.data.usage = usageStr; 
     usage.flush(); 

     countService.send(); 

    } else { 

     usage.data.usage = "1"; 
     usage.flush(); 

     countService.send(); 
    } 

} 

需要注意的是,如果该对象不存在,它会自动重新创建很重要。这是关于SharedObjects的令人困惑的部分。

我们所要做的是全局声明变量:

public var usage:SharedObject; 

,然后调用它的init()函数:

usage = SharedObject.getLocal("usage"); 

如果它不存在,那么它就会被创建。

+0

感谢伟大的代码片段。不幸的是,这并没有解决我的问题。我从来没有得到SharedObject的实例(表示它的变量被赋值为空),所以没有什么可以调用length()(或flush()等)。 – 2012-03-29 13:55:43

+0

好吧,您在访问共享对象时遇到异常? – Triode 2012-03-29 14:05:46

+0

是的。我调用了SharedObject.getLocal(“myStorage”),它引发RangeError,当getLocal找到一个Flash cookie但无法检索它时,这是预期的行为。所以我没有得到一个SharedObject的实例来处理。 – 2012-03-29 14:32:25

0

我不太确定为什么你会得到一个范围错误 - 特别是如果你报告可以找到它。我唯一的猜测就是,跨域政策有可能跨越边界。假设IT可以控制托管服务器的位置,如果子域名曾经改变,甚至访问类型(从标准到https),这可能会导致问题,特别是如果应用程序正在进行(已经通过多次发布)。我觉得很难相信你正试图检索一个已经被另一个应用程序命名的名为SO--实质上是名称冲突。在这方面,即使在这些事情上,我们中的很多人仍然使用反向dns风格的命名约定。

如果你能捕捉到错误,它应该是相对微不足道的恢复: - 只需在try的范围之外声明变量,以便它可以被捕获。 [编辑]:由于它是一种静态方法,因此您可能需要创建一个后缀,以使用新的标识符重新开始。

var mySO:SharedObject; 
.... 
catch(e:Error) 
{ 
     mySO = SharedObject.getLocal('my.reversedns.so_name_temp_name'); 
     //might want to dispatch an error event or rethrow a specific exception 
     //to alert the user their "preferences" were reset. 
} 
相关问题