سؤال

عند تشغيل أحد تطبيقات فليكس في التصحيح مشغل فلاش أحصل على استثناء المنبثقة في أقرب وقت كما حدث شيء غير متوقع.ومع ذلك عندما يستخدم العميل التطبيق أنه لا يستخدم التصحيح فلاش لاعب.في هذه الحالة لا يجب استثناء يطفو على السطح ، ولكنه واجهة المستخدم لا يعمل.

حتى المحسنة الأسباب ، أود أن التقاط أي الاستثناء الذي يمكن أن يحدث في أي مكان في فليكس واجهة المستخدم وتقديم رسالة خطأ في فليكس الداخلية المنبثقة.باستخدام جافا أود فقط أن تغلف كل رمز واجهة المستخدم في try/catch, ولكن مع MXML التطبيقات في فليكس أنا لا أعرف أين يمكنني أداء هذا العام حاول/catch.

هل كانت مفيدة؟

المحلول

لا توجد وسيلة أن يتم إعلامك على غير مسك الاستثناءات في فليكس 3.أدوبي على بينة من المشكلة ولكن لا أعرف إذا كانت الخطة على إيجاد الحل.

الحل الوحيد كما يقف هو وضع try/catch في منطقية الأماكن و تأكد من أن يتم الاستماع إلى الخطأ (أو خطأ webservices) حدث أي شيء أن ترسل لهم.

تحرير: علاوة على ذلك, انها في الواقع من المستحيل للقبض على خطأ القيت من معالج الحدث.لقد سجلوا علة على أدوبي علة النظام.

تحديث 2010-01-12: العالمية معالجة الخطأ هو الآن معتمد في فلاش 10.1 و الهواء 2.0 (سواء في بيتا), و يتحقق ذلك عن طريق الاشتراك في UNCAUGHT_ERROR حال LoaderInfo.uncaughtErrorEvents.التعليمة البرمجية التالية مأخوذة من نموذج التعليمات البرمجية على livedocs:

public class UncaughtErrorEventExample extends Sprite
{
    public function UncaughtErrorEventExample()
    {
        loaderInfo.uncaughtErrorEvents.addEventListener(
            UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
    }

    private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
    {
        if (event.error is Error)
        {
            var error:Error = event.error as Error;
            // do something with the error
        }
        else if (event.error is ErrorEvent)
        {
            var errorEvent:ErrorEvent = event.error as ErrorEvent;
            // do something with the error
        }
        else
        {
            // a non-Error, non-ErrorEvent type was thrown and uncaught
        }
    }

نصائح أخرى

هناك خلل/طلب ميزة هذا في أدوبي علة نظام إدارة.التصويت لأنه إذا كان مهم بالنسبة لك.

http://bugs.adobe.com/jira/browse/FP-444

كان يعمل في سلك معزول 3.3.

 if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
    IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
 }

علما بأن علة FP-444 (أعلاه) روابط http://labs.adobe.com/technologies/flashplayer10/features.html#developer أنه منذ أكتوبر 2009 يظهر أن هذا سيكون ممكنا اعتبارا من 10.1 حاليا, أكتوبر 28, 2009 لا تزال غير منشورة - لذا أعتقد أننا سوف نرى إن كان هذا صحيحا عندما يحصل صدر

بديل قبول الجواب ، باستخدام المحاولة-catch.أبطأ ولكن أكثر وضوحا للقراءة ، على ما أعتقد.

try {
    loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError);
} catch (e:ReferenceError) {
    var spl:Array = Capabilities.version.split(" ");
    var verSpl:Array = spl[1].split(",");

    if (int(verSpl[0]) >= 10 &&
        int(verSpl[1]) >= 1) {
        // This version is 10.1 or greater - we should have been able to listen for uncaught errors...
        d.warn("Unable to listen for uncaught error events, despite flash version: " + Capabilities.version);
    }
}

بالطبع, سوف تحتاج إلى استخدام ما يصل إلى تاريخ 10.1 playerglobal.swc من أجل ترجمة هذه التعليمة البرمجية بنجاح:http://labs.adobe.com/downloads/flashplayer10.html

أنا باستخدام فليكس 4.حاولت loaderInfo.UncaughtErrorEvents, ولكن loaderInfo لم يكن مهيأ لذلك أعطاني null إشارة الخطأ.ثم حاولت root.loaderInfo.UncaughtErrorEvents و نفس القصة.حاولت sprite.root.UncaughtErrorEvents, لكن لم يكن هناك العفريت كائن ، أنا خلق واحد ، ولكنه لم ينجح.وأخيرا حاولت

systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,globalUnCaughtErrorHandler.hanleUnCaughtError);

وتخمين ما, وهي تعمل مثل السحر.تحقق هذا

كان يعمل في سلك معزول 3.5 و فلاش لاعب 10:

<?xml version="1.0" encoding="utf-8"?>

        protected function application1_addedToStageHandler(event:Event):void{              
            if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
                IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
            }

            sdk.text = "Flex " + mx_internal::VERSION;
        }

        private function uncaughtErrorHandler(e:*):void{
            e.preventDefault();

            var s:String;

            if (e.error is Error)
            {
                var error:Error = e.error as Error;
                s = "Uncaught Error: " + error.errorID + ", " + error.name + ", " + error.message;
            }
            else
            {
                var errorEvent:ErrorEvent = e.error as ErrorEvent;
                s = "Uncaught ErrorEvent: " + errorEvent.text;
            }

            msg.text = s;
        }

        private function unCaught():void
        {
            var foo:String = null;
            trace(foo.length);
        }
    ]]>
</mx:Script>
<mx:VBox>
    <mx:Label id="sdk" fontSize="18"/>
    <mx:Button y="50" label="UnCaught Error" click="unCaught();" />
    <mx:TextArea id="msg" width="180" height="70"/>
</mx:VBox>

شكرا

ويعلق حال المستمع إلى جذر 'التي عملت بالنسبة لي:

sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

في تصحيح مشغل فلاش هذا سوف لا يزال الخطأ ، ولكن في عدم إصدار تصحيح الخطأ سوف تظهر في مشغل فلاش مربع الحوار ثم معالج سوف تستجيب.لوقف مربع الحوار من قبل الظهور ، إضافة:

event.preventDefault();

لذلك:

    private function onUncaughtError(event:UncaughtErrorEvent):void
    {
        event.preventDefault();
        // do something with this error
    }

لقد تم استخدام هذا في الهواء ، ولكن أفترض أنه يعمل القياسية AS3 المشاريع أيضا.

الآن يمكنك استخدام محمل معلومات:

http://www.adobe.com/devnet/flex/articles/global-exception-handling.html

الخروج:loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top