web-dev-qa-db-ja.com

Flexですべての例外をキャッチする方法は?

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

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

43
Yaba

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

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

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

アップデート2010-01-12:グローバルエラー処理が Flash 10.1 および AIR 2. でサポートされるようになりました=(両方ともベータ版)、そして NCAUGHT_ERRORLoaderInfo.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
        }
    }
52
Richard Szalay

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

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

9
Samuel Crank

Flex 3.3で動作します。

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

フレックス4を使用しています。loaderInfo.UncaughtErrorEvents,を試しましたが、loaderInfoが初期化されていないため、null参照エラーが発生しました。次に、root.loaderInfo.UncaughtErrorEventsと同じストーリーを試しました。 Sprite.root.UncaughtErrorEventsを試しましたが、Spriteオブジェクトがありませんでした。作成しましたが、機能しませんでした。やっと試しました

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

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

3
Rose

受け入れられた回答の代わりに、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

3
aaaidan

Flex 3.5およびFlash Player 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>

ありがとう

3
Jefferson

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

3
Peter V. Mørch

イベントリスナーを 'root'に接続しました。

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

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

event.preventDefault();

そう:

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

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

2
neave

これで、ローダー情報を使用して次のことができます。

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.
}
0
Pablo