使用 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()
获取错误的堆栈跟踪会在错误构建时以字符串形式返回错误的调用堆栈。请注意,堆栈跟踪的行号是强制转换的行。
相反,从
getStackTrace()
调用 event.error
,如下所示: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 编码到 AS3 可能会有细微差别,后者支持
UncaughtErrorEvent
。除此之外,确保每个 ActionScript 版本都有合适的调试播放器。在运行时的非调试器版本中,
Error.getStackTrace()
方法返回 null
。关于actionscript-3 - ActionScript 编译器 UncaughtErrorEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16073357/