在一次加载外部swf文件时发现因为这个swf文件本身有异常从而引发程序卡掉,通过浏览器打开也一样。 后来用swfinfo查看了下这个文件的信息,发现它是用flex3制作的,可能是因为编译时未选择代码合并造成的。 但我的目的是遇到这类文件直接提示并且不进行加载,但我发现无论如何都没有办法捕获这些异常,也就没有办法阻止它加载了。 异常如下:
VerifyError: Error #1053: Illegal override of activate in mx.managers.SystemManagerProxy.
ReferenceError: Error #1065: Variable _PublishPanel_mx_managers_SystemManager is not defined.
还好我发现swfinfo可以执行它并打印异常信息,于是我试图通过swfinfo来处理这个异常文件, 但是flex不像java可以直接像调用命令行一样调用外部程序,它必须先new一个File,但这个swfinfo很奇怪,如果执行时带上后缀名它是不能执行swf文件的,只是提取它的文件描述信息,如果不带后缀名就可以执行它并且可以打印异常。 这与flex的调用外部文件的方式不兼容。 后来采取借用cmd命令的方式来实现了。
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); var cmdExe:File = new File("C:\\Windows\\System32\\cmd.exe"); var args:Vector.= new Vector. (); if (cmdExe && cmdExe.exists) { var nativePath:String = new File(url).nativePath; var swfinfoFolder:String = File.applicationDirectory.resolvePath("bin").nativePath; args.push("/C", swfinfoFolder + "/swfinfo", nativePath); nativeProcessStartupInfo.executable = cmdExe; nativeProcessStartupInfo.arguments = args; process = new NativeProcess(); process.start(nativeProcessStartupInfo); process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData); process.addEventListener(NativeProcessExitEvent.EXIT, onExit); process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError); process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError); } public function onOutputData(event:ProgressEvent):void { trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable)); } public function onErrorData(event:ProgressEvent):void { trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable)); } public function onIOError(event:IOErrorEvent):void { trace("ioerror: ", event.toString()); } public function onExit(event:NativeProcessExitEvent):void { if ( event.exitCode == 0 ) { loadSWF(); } else { Alert.show("Code: " + event.exitCode + "\n文件\"" + source + "\"有异常,请检查后重新加载"); } }
也许这个方法并不优雅,但是它暂时解决了我的问题。 尤其是cmd命令只是固定读取位置,一旦它不在那儿就失效了。 我尝试了将这个命令文件拷贝到我的应用目录中并通过相对路径读取并运行它,目前没发现问题。 但不能保证它能在所有的windows平台通用。
如果哪位朋友有更好的办法还请指教,我没有发现flex中有获得系统安装目录的方法。