加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flex – 是否可以在不使用调试模式的情况下找到导致ActionScript

发布时间:2020-12-15 02:11:34 所属栏目:百科 来源:网络整理
导读:我目前正在尝试为Flex应用程序实现自动错误报告器,并希望将错误消息与导致错误的函数/行号一起返回到服务器.本质上,我试图获取getStackTrace()信息而不进入调试模式,因为该应用程序的大多数用户不太可能拥有Flash播放器的调试版本. 我当前的方法是使用Uncaug
我目前正在尝试为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’.任何使用此功能的解决方案都是我特别想避免的.

解决方法

刚刚注意到关于“我不想使用调试”的部分.嗯,这不是一个选项,因为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.";
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读