我目前正在尝试为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'。任何使用此功能的解决方案都是我特别想避免的。
答案 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播放器的调试版本中使用
所以看起来你现在正在坚持做下去。