Actionscript 3 未处理的套接字安全性错误,即使(表面上)正在处理它
我有一个问题,在启动我的应用程序后,我偶尔(也不是总是)会从调试Flash Player中看到以下错误弹出窗口: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
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:*)完全偏执。