2012-03-29 31 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. 
} 
相關問題