是否可以在不使用调试模式的情况下找到导致ActionScript 3.0错误的函数和/或行号?

时间:2011-06-28 19:50:16

标签: flex actionscript-3 error-handling

我目前正在尝试为Flex应用程序实现自动错误报告器,并希望将错误消息与导致错误的函数/行号一起返回到服务器。基本上,我试图获取getStackTrace()信息而不用进入调试模式,因为该应用的大多数用户都不太可能拥有Flash播放器的调试版本。

我当前的方法是使用UncaughtErrorEvent处理程序来捕获应用程序中发生的错误,但错误消息只返回已发生的错误类型,而不是位置(这意味着它无用)。我尝试使用函数名称获取器(如

)自己实现getStackTrace()
            private function getFunctionName (callee:Function, parent:Object):String {
                for each ( var m:XML in describeType(parent)..method) {
                    if ( this[m.@name] == callee) return m.@name;
                }
                return "private function!";
            }

但这只会因为arguments.callee而起作用,所以不会经历多级函数调用(它永远不会超过我的错误事件监听器)。

原来如此!任何人对如何通过全局获取信息性错误消息有任何想法 错误事件处理程序?

编辑:似乎存在一些误解。我明确地避免使用getStackTrace(),因为它在不处于调试模式时返回'null'。任何使用此功能的解决方案都是我特别想避免的。

2 个答案:

答案 0 :(得分:3)

刚刚注意到关于“我不想使用调试”的部分。嗯,这不是一个选项,因为Flash的非调试版本根本没有任何堆栈跟踪概念。糟透了,不是吗?


不相关但仍然很酷。

其余的只适用于调试播放器。

这是我个人调试类的一部分(奇怪的是,它被添加到我工作的每个项目中)。它返回一个String,表示传递的堆栈中的索引 - 类和方法名称。一旦你有了这些,行号是微不足道的。

    /**
 * Returns the function name of whatever called this function (and whatever called that)...
 */
public static function getCaller( index:int = 0 ):String
{
    try
    {
            throw new Error('pass');
    } 
    catch (e:Error)
    {
        var arr:Array = String(e.getStackTrace()).split("\t");
        var value:String = arr[3 + index];
        // This pattern matches a standard function.
        var re:RegExp    = /^at (.*?)\/(.*?)\(\)/ ;     
        var owner:Array  = re.exec(value);
        try 
        {
            var cref:Array = owner[1].split('::');
            return cref[ 1 ] + "." + owner[2];
        }
        catch( e:Error )
        {
            try
            {
                re = /^at (.*?)\(\)/; // constructor.
                owner = re.exec(value);
                var tmp:Array    = owner[1].split('::');
                var cName:String = tmp.join('.');
                return cName;
            }
            catch( error:Error )
            {
            }
        }
    }
    return "No caller could be found.";
}

作为旁注:这没有正确设置来处理事件模型 - 有时事件本身就是没有调用者或者是一些非常奇怪的替代语法。

答案 1 :(得分:2)

您不必抛出错误来获取堆栈跟踪。

var myError:Error = new Error();
var theStack:String = myError.getStackTrace();

good reference on the Error class


[编辑]
在阅读我自己的参考资料后,不用getStackTrace()只能在flash播放器的调试版本中使用 所以看起来你现在正在坚持做下去。