我目前正在尝试为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."; }
作为旁注:这没有正确设置来处理事件模型 – 有时事件本身就是没有调用者或一些非常奇怪的替代语法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。