Actionscript 3 未处理的套接字安全性错误,即使(表面上)正在处理它

Actionscript 3 未处理的套接字安全性错误,即使(表面上)正在处理它,actionscript-3,sockets,error-handling,Actionscript 3,Sockets,Error Handling,我有一个问题,在启动我的应用程序后,我偶尔(也不是总是)会从调试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::MyClassUsi

我有一个问题,在启动我的应用程序后,我偶尔(也不是总是)会从调试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
,当套接字服务器未运行并侦听连接时会发生此错误,这是意料之中的。然而,我不明白的是,当我在尝试连接套接字时(以及
SecurityErrorEvents
的侦听器,尽管此错误消息似乎没有指向
SecurityErrorEvents
)使用try/catch块捕获
SecurityError时,为什么Flash Player会抱怨未处理的安全错误

相关类别的构造函数如下所示:

/**
* 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;
    }
}

你知道为什么会发生这种情况吗?我遗漏了什么?

这可能不是问题所在,但您正在捕获SecurityError及其抛出的SecurityError。也许可以尝试在黑暗中使用小写字母。

拍摄:尝试捕捉一般错误



        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 );
        }

我认为对话框中显示的错误不是同步的。我几乎可以肯定,它们被抛出了代码路径之外(在异步网络事件期间),所以用try-catch捕捉它们是不可能的

那么您认为在正确的调度程序上侦听正确的事件会捕获错误吗?我尝试过监听stage、root、对象(套接字),但没有任何东西可以抑制错误

是的,这太可怕了。我一直在寻找捕捉这些小动物的方法。唯一的安慰是,我认为它在播放器的发行版中被抑制了。还是很神秘吧?也没有太多的文档(我已经找到)


这不是一个真正的答案。对不起。

我也为此挣扎了几个小时。解决方案是侦听SecurityErrorEvent.SECURITY\u错误。显然,只有在没有此类事件处理程序的情况下才会引发SecurityError。

是的,整个小写问题有点混乱:“SecurityError”和小写“s”似乎指的是SecurityErrorEvents(可能是因为您使用这些事件的小写版本在MXML中指定事件侦听器):您还可以捕获(e:*)完全偏执。