耍了一下 UncaughtErrorEvents
玩了一下UncaughtErrorEvents,發現沒有想象中神奇。
首先是編譯器比較2,不支持例子中的代碼,還要hack一下。
然后是實際效果了,本來以為加了全局錯誤處理,就可以把錯誤銷匿于無形。這話的兩說,如果Release版本倒確實如此,不過Release版本的話,本來也看不出什么反應,如果是Debug版本,那個討厭的框框還是會彈出來的。也就是說,Debug版本那個框執行的順序優先于UncaughtError的處理函數。
最后發現是自己想的太美好,而且不注重錯誤處理,竟然把Adobe實現的這么NB的功能,想成主要是用來藏匿框框,實在不應該。
?
?
于是仔細閱讀了幫助,發現有以下幾個特點。
第一,該事件可以加在兩個地方,一個是LoaderInfo,一個是Loader。以一個swf為一個對象的話,前者用來監聽自身的所有未捕捉的錯誤,后者用來監聽被加載對象的未捕捉錯誤。
第二,Flash9以前的老版本swf,以及頁面對象(Flex,AIR)中出現的未捕捉錯誤,不受控制。
第三,處理函數中,如果又報錯,不會產生遞歸調用。
第四,如果不想看到Debug版本中那個煩人的彈出框,需要在函數內寫上e.preventDefault();
?
以下是臨時用測試代碼...
?
package {import flash.display.*;import flash.events.*;import flash.net.URLRequest;import flash.text.TextField;public class GlobalErrorHandling extends Sprite{public function GlobalErrorHandling() {if (stage) init();else addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);}private function onAddedToStage(e:Event):void {removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);init();}private function init():void{if (!loaderInfo.hasOwnProperty('uncaughtErrorEvents')) return;loaderInfo['uncaughtErrorEvents'].addEventListener('uncaughtError', onUncaughtError);stage.addEventListener(MouseEvent.CLICK, onClick);}private function onClick(e:MouseEvent):void {var foo:Number = Math.random();switch(true){case (foo > .7) : throw new Error('Wow!'); break;case (foo > .5) : throw new ArgumentError('Kak!'); break;case (foo > .2) : throw "String Exception"; break;case (foo > .0) : new Loader().load(new URLRequest('noexist.swf')); break;}}private function onUncaughtError(e:*):void {e.preventDefault();var message:String;switch(true){case (e.error is Error): message = Error(e.error).message; break;case (e.error is ErrorEvent): message = ErrorEvent(e.error).text; break;default: message = e.error.toString(); break;}log(message);throw "Error In UncaughtError Handler!";log('I am invisiable man');}private function log(msg:String):void{if (getChildByName('logTxt') is TextField){TextField(getChildByName('logTxt')).appendText(msg + '\n');TextField(getChildByName('logTxt')).scrollV = TextField(getChildByName('logTxt')).maxScrollV;return;}var txt:TextField = new TextField();txt.name = 'logTxt';txt.width = 500;txt.height = 400;txt.x = txt.y = 100;txt.text = '';addChild(txt);}}}轉載于:https://www.cnblogs.com/holybozo/archive/2010/06/12/1757342.html
總結
以上是生活随笔為你收集整理的耍了一下 UncaughtErrorEvents的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式数据库的应用(一)
- 下一篇: 将js文件编译成动态链接库(dll)文件