2

アプリを起動した後、Debug Flash Player から以下のエラー ポップアップがときどき (常にではありません) 表示されるという問題があります。

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: http://example.com/myApp.swf cannot load data from localhost:4499.
    at org.mydomain.mypackage::MyClassUsingSocket()
    at MyMainApplicationClass$cinit()
    at global$init()
    at global$init()
    at flash.system::ApplicationDomain/hasDefinition()
    at mx.managers::SystemManager/getDefinitionByName()
    at _MyMainApplicationClass_mx_managers_SystemManager/create()
    at mx.managers::SystemManager/initializeTopLevelWindow()
    at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()

localhost:4499このアプリには経由で接続しようとするコードがいくつかありますSocketが、このエラーは、ソケット サーバーが実行されておらず、接続をリッスンしていないときに発生します。ただし、理解できないのは、ソケットに接続しようとしたときに s をキャッチするための try/catch ブロックがあるときに、Flash Player が未処理の securityErrors について不平を言っている理由です (および、このエラーメッセージSecurityErrorSecurityErrorEventsには表示されないのリスナー)を指しているように見えますが)。

関連するクラスのコンストラクターは次のとおりです。

/**
* Constructor.
*/
public function MyClassUsingSocket(aHost:String = null, aPort:int = -1):void
{
    super();

    var hostToConnectTo:String = (aHost != null) ? aHost : DEFAULT_HOST;
    var portToConnectTo:int = (aPort != -1) ? aPort : DEFAULT_PORT;


    try
    {
        _out_socket = new Socket();

        // note: the event handlers used below are private functions within the same class
        _out_socket.addEventListener(Event.CONNECT, _socketConnectEventHandler, false,0,true);
        _out_socket.addEventListener(IOErrorEvent.IO_ERROR, _socketIOErrorEventHandler, false,0,true);
        _out_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _socketSecurityErrorEventHandler, false,0,true);

        _out_socket.connect(hostToConnectTo, portToConnectTo);
    }
    catch(e:IOError)
    {
        enabled = false;
    }
    catch(e:SecurityError)
    {
        enabled = false;
    }
}

なぜこれが起こっているのかについてのアイデアはありますか? 私は何が欠けていますか?

4

4 に答える 4

4

私もこれに数時間苦労しました。解決策は、SecurityErrorEvent.SECURITY_ERROR をリッスンすることです。どうやら SecurityError は、そのようなイベント ハンドラーがない場合にのみ発生します。

于 2009-06-23T14:58:25.190 に答える
0

ダイアログ ボックスに表示されるエラーは同期的ではないと思います。コード パスの外 (非同期ネットワーク イベント中) にスローされることはほぼ確実であるため、try-catch でそれらをキャッチすることは不可能です。

では、適切なディスパッチャーで適切なイベントをリッスンすると、エラーがキャッチされると思いますか? ステージ、ルート、オブジェクト (ソケット) をリッスンしようとしましたが、何もエラーを抑制しません。

ええ、それはかなり恐ろしいです。しばらくの間、これらの小さな生き物を捕まえる方法を探していました。唯一の慰めは、プレーヤーのリリース バージョンでは抑制されていると思うことです。それでも、それは不可解ですよね?ドキュメントもあまりありません(私が見つけたものです)。

これは本当の答えではありません。ごめん。

于 2008-12-01T02:57:55.950 に答える
-1

これは問題ではないかもしれませんが、SecurityError をキャッチし、securityError をスローしています。s を小文字にしてみてください。

于 2008-11-18T12:51:58.173 に答える
-1

暗闇でのショット: 一般的なエラーをキャッチしてみませんか?



        try
        {
                _out_socket = new Socket();

                // note: the event handlers used below are private functions within the same class
                _out_socket.addEventListener(Event.CONNECT, _socketConnectEventHandler, false,0,true);
                _out_socket.addEventListener(IOErrorEvent.IO_ERROR, _socketIOErrorEventHandler, false,0,true);
                _out_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _socketSecurityErrorEventHandler, false,0,true);

                _out_socket.connect(hostToConnectTo, portToConnectTo);
        }
        catch(e:IOError)
        {
                enabled = false;
        }
        catch(e:SecurityError)
        {
                enabled = false;
        }
        catch( e:Error )
        {
                trace( e );
        }
于 2008-11-18T14:04:30.757 に答える