Apache flex Flex/actionscript 3相当于_文件和_行__

Apache flex Flex/actionscript 3相当于_文件和_行__,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我对flex/actionscript很陌生,我想知道php(和其他语言)文件和行标识符是否有等价物 基本上,我想做一些自定义错误日志记录,并想做一些类似于: var mymessage:String = 'Oops, a hiccup occured at ' + __FILE__ + ', line: ' + __LINE__; 其中文件和行当然会在编译时替换为它们的值 这可能吗?这不是直接可能的,但是对于个人测试有一个相当有用的解决方法 var stackTrace:String =

我对flex/actionscript很陌生,我想知道php(和其他语言)文件标识符是否有等价物

基本上,我想做一些自定义错误日志记录,并想做一些类似于:

 var mymessage:String = 'Oops, a hiccup occured at ' + __FILE__ + ', line: ' + __LINE__; 
其中文件和行当然会在编译时替换为它们的值


这可能吗?

这不是直接可能的,但是对于个人测试有一个相当有用的解决方法

var stackTrace:String = new Error().getStackTrace();
if (stackTrace) {
    var mymessage:String = "Oops, a hiccup occurred " + stackTrace.split("\n")[1];
}

调整您对
getStackTrace
的滥用以适应口味。

IMHO行或文件不会在Flex中添加太多信息。我通常输出类和方法名,由于我的方法往往比较短,所以通常很清楚发生了什么


如果您发现自己使用了数百行长的方法,那么您应该重新考虑您的编码风格

补充科里对上述问题的回答。首先添加:

-define=CONFIG::debugging,true
到库的编译器设置(在“附加编译器参数”中“-locale en_US”旁边)。然后使用此快速库:

package ddd
{
  public class Stack
  {
    protected static function str(val:*):String
    {
      if( val == null      ) return "<null>";
      if( val == undefined ) return "<undefined>";
      return val.toString();
    }

    protected static var removeAt :RegExp = /^\s*at\s*/i;
    protected static var matchFile:RegExp = /[(][)][\[][^:]*?:[0-9]+[\]]\s*$/i;
    protected static var trimFile :RegExp = /[()\[\]\s]*/ig;

    /* Must maintain number of stack levels, so that _stack can assume the 4th line of getStackTrace */
    private static function _stack( msg:String="", ...params ):String
    {
      var s   :String = new Error().getStackTrace();
      var func:String = "??";
      var file:String = "??";
      var args:String = null;
      if(s)
      {
        func = s.split("\n")[4];
        func = func.replace( removeAt, "" );
        var farr:Array  = func.match( matchFile );
        if( farr != null && farr.length > 0 ) file = farr[0].replace( trimFile, "" );
        func = func.replace( matchFile, "" );
      }
      for each( var param:* in params )
      {
        args = ( args == null ? "" : args.concat(",") );
        args = args.concat( str(param) );
      }
      return func + "(" + (args==null?"":args) + ")" + ( (msg!=null && msg!="") ? ":"+msg : "" ) + " at " + file;
    }

    /* Must maintain number of stack levels, so that _stack can assume the 4th line of getStackTrace */
    public static function stack( msg:String="", ...params ):String
    {
      params.unshift( msg );
      return _stack.apply( null, params );
    }

    /* Must maintain number of stack levels, so that _stack can assume the 4th line of getStackTrace */
    public static function pstack( msg:String="", ...params ):void
    {
      CONFIG::debugging {
        params.unshift(msg);
        trace( _stack.apply( null, params ) );
      }
    }
  }
}
在任何函数中打印该点的堆栈位置,如下所示:

package::classname/function() at /wherever/src/package/classname.mxml:999

在编译用于生产之前,请记住将调试设置为false,剩下的只是一个空的pstack调用,该调用不起任何作用-gut将被有条件地编译出来。

…不可能直接执行…:(我担心情况会是这样,因为谷歌什么都没想到。谢谢你的提醒。@Douwe:stackTrace在非调试版本中工作,它会给你类和方法名,但不会给你行号。希望方法名足以跟踪它,如果你有100多行方法,那这是另一个问题:)我原以为是这样的,但医生说它返回
null
,我没有时间确认/否认。谢谢你的提醒,我要测试一下,谢谢。我关注文件名和行号的主要原因是,我们已经用于其他应用程序的集中式日志应用程序将它们作为输入,因此我希望它们能够完成,并且不必重做日志应用程序的某些部分。除此之外的任何内容,如“日志级别”,您都可以创建自己的日志界面,根据我的经验,这是一个巨大的兔子洞,花费的时间很少有回报。使用系统附带的标准配置。我之所以喜欢这个,是因为这个调用太小太愚蠢了,你可以把它放在一行函数中,而不用让它们向右滚动太远。这听起来是个好主意。你能帮我寄密码吗?理想的情况是:
var-msg:String=thisclassname+“+thismethodname+”:一条错误消息”还是说手动键入每个类名和方法名?
package::classname/function() at /wherever/src/package/classname.mxml:999