43

デバッグフラッシュプレーヤーでFlexアプリケーションを実行すると、予期しないことが発生するとすぐに例外ポップアップが表示されます。ただし、顧客がアプリケーションを使用する場合、デバッグフラッシュプレーヤーは使用しません。この場合、彼は例外ポップアップを受け取りませんが、UIは機能していません。

したがって、サポートの理由から、Flex UIのどこででも発生する可能性のある例外をキャッチし、Flexの内部ポップアップにエラーメッセージを表示したいと思います。Javaを使用することで、UIコード全体をtry / catchブロックにカプセル化するだけですが、FlexのMXMLアプリケーションでは、このような一般的なtry/catchをどこで実行できるかわかりません。

4

9 に答える 9

52

Flex 3 でキャッチされない例外について通知を受ける方法はありません。アドビはこの問題を認識していますが、回避策を作成する予定があるかどうかはわかりません。

現状の唯一の解決策は、try/catch を論理的な場所に配置し、それらをディスパッチするすべてのエラー (または Web サービスの場合は FAULT) イベントをリッスンしていることを確認することです。

編集:さらに、イベント ハンドラーからスローされたエラーをキャッチすることは実際には不可能です。Adobe Bug System にバグを記録しました。

2010 年 1 月 12 日更新:グローバル エラー処理がFlash 10.1およびAIR 2.0 (どちらもベータ版) でサポートされるようになりました。次のコードは、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
        }
    }
于 2008-09-19T13:49:01.197 に答える
9

Adobe バグ管理システムには、これに関するバグ/機能のリクエストがあります。それがあなたにとって重要である場合は、それに投票してください。

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

于 2008-11-04T15:28:15.543 に答える
4

Flex 3.3 で動作します。

 if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
    IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
 }
于 2010-03-23T13:48:20.910 に答える
3

バグ FP-444 (上記) がhttp://labs.adobe.com/technologies/flashplayer10/features.html#developerにリンクしていることに注意してください。これは、2009 年 10 月以降、これが 10.1 で可能になることを示しており、現在は 10 月 28 日です。 2009年はまだリリースされていないので、リリースされたときにそれが本当かどうかがわかると思います

于 2009-10-28T12:09:34.493 に答える
3

try-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

于 2010-06-11T04:29:54.283 に答える
3

Flex 3.5 および Flash Player 10 で動作します。

  <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" addedToStage="application1_addedToStageHandler(event)">
    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            
            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>
</mx:Application>

ありがとう

于 2011-07-06T13:18:27.323 に答える
3

私はflex 4を使用しています。試してみloaderInfo.UncaughtErrorEvents,ましたが、loaderInfoが初期化されていなかったため、null参照エラーが発生しました。それから私は試しroot.loaderInfo.UncaughtErrorEventsてみましたが、同じ話です。を試してみsprite.root.UncaughtErrorEventsましたが、スプライト オブジェクトがなく、作成しましたが、機能しませんでした。最後に試してみました

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

そして、それは魔法のように機能します。これをチェック

于 2011-05-05T14:11:48.720 に答える
2

イベントリスナーを「ルート」にアタッチしました。これは私のために機能しました。

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

デバッグ用のFlashPlayerでは、これは引き続きエラーになりますが、非デバッグバージョンでは、エラーはFlash Playerのダイアログボックスに表示され、ハンドラーが応答します。ダイアログボックスが表示されないようにするには、次を追加します。

event.preventDefault();

それで:

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

私はこれをAIRで使用していましたが、標準のAS3プロジェクトでも機能すると思います。

于 2011-02-14T17:06:08.947 に答える