actionscript-3 - ActionScript 编译器 UncaughtErrorEvent

标签 actionscript-3 flash air

在使用 asc2 编译 AIR 应用程序后,我发现在捕获 UncaughtErrorEvent 时缺少错误堆栈跟踪。

示例代码如下:

var root:Sprite = this;
root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,errorHandle);
throw new Error("test");

protected function errorHandle(event:UncaughtErrorEvent):void
        {
            var message:String; 
            if (event.error is Error) { 
                message = Error(event.error).message; 
                message+="\n"+Error(event.error).getStackTrace();
            } else if (event.error is ErrorEvent) { 
                message = ErrorEvent(event.error).text;
            } else { 
                message = event.error.toString(); 
            } 
        }

在使用 ASC1 时,我可以在错误句柄中看到完整的堆栈跟踪。但是使用 ASC2,只是一个空的堆栈跟踪。

有人遇到同样的问题吗?

如何获取 UncaughtErrorEvent 堆栈跟踪?

最佳答案

不要将 event.error 转换为 Error,如:

Error(event.error).getStackTrace()

获取错误的堆栈跟踪会返回错误构造时错误的调用堆栈作为字符串。请注意,堆栈跟踪的行号是强制转换的行。

相反,从 event.error 调用 getStackTrace(),如:

event.error.getStackTrace()

根据您的示例,堆栈上没有任何重要信息。

添加递归有助于证明问题:

package
{
    import flash.display.Sprite;
    import flash.events.UncaughtErrorEvent;

    public class ExceptionTest extends Sprite
    {
        public function ExceptionTest()
        {
            super();

            loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
            recursion();
        }

        protected function recursion(depth:uint=0):void
        {
            if (depth == 5)
                throw new Error("test");
            else
                recursion(++depth);
        }

        protected function uncaughtErrorHandler(event:UncaughtErrorEvent):void
        {
            trace(event.error.getStackTrace());
        }
    }
}

...会产生:

Error: test
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:19]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:13]
[SWF] Users:jsturges:dev:flash-workspace:X:bin-debug:ExceptionTest.swf - 1,745 bytes after decompression
Error: test
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:19]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:13]

如果 uncaughtErrorHandler() 更改为您的示例转换为 Error,如:

protected function uncaughtErrorHandler(event:UncaughtErrorEvent):void
{
    trace(Error(event.error).getStackTrace());
}

调试器捕获异常,但 getStackTrace 是强制转换行:

Error: test
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:19]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:13]
[SWF] Users:jsturges:dev:flash-workspace:X:bin-debug:ExceptionTest.swf - 1,519 bytes after decompression
Error: Error: test
    at ExceptionTest/uncaughtErrorHandler()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:26]

从 Flash Player 10.1 开始,将 AS1 和 AS2 编码到支持 UncaughtErrorEvent 的 AS3 也可能存在细微差别。

除此之外,确保每个 ActionScript 版本都有适当的调试播放器。在运行时的非调试器版本中,Error.getStackTrace() 方法返回 null

关于actionscript-3 - ActionScript 编译器 UncaughtErrorEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16073357/

相关文章:

用于接收从 Chrome 共享的 URL 的 Android Intent 过滤器

apache-flex - 为什么 FlexUnit 中没有 assertError() 函数?

php - 从 php 到 flash 的返回变量未定义

flash - 为什么 Flash ActionScript3 编译器会生成不必要的代码?

javascript - 在准确的时间停止视频

flash - Arial 字体在 Mac 中无法正确显示

javascript - 将 Flex/Flash 交叉编译为 Javascript

apache-flex - 在 Flex 4 中打印滚动条内的内容

java - 在 Android AIR 应用程序中设置 BroadcastReceiver

actionscript-3 - AS3 : Working with multiple sounds & channels - are there any good libraries for this?