Flex / actionscript 3 эквивалента для __FILE__ и __LINE__ - PullRequest
3 голосов
/ 27 апреля 2010

Я довольно новичок в flex / actionscript, и мне было интересно, есть ли эквивалент для php (и других языков) FILE и LINE идентификаторов?

В основном, я хочу сделать какую-нибудь пользовательскую регистрацию ошибок и хотел бы что-то вроде:

 var mymessage:String = 'Oops, a hiccup occured at ' + __FILE__ + ', line: ' + __LINE__; 

Где файл и строка будут заменены их значениями во время компиляции.

Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

Это не возможно напрямую, но есть довольно полезный обходной путь для личного тестирования

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

Отрегулируйте злоупотребление getStackTrace по вкусу.

1 голос
/ 02 июля 2010

Чтобы добавить ответ Кори на вышеизложенное. Первое добавление:

-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 ) );
      }
    }
  }
}

И тогда вы можете просто позвонить:

Stack.pstack();

внутри любой функции для печати местоположения стека в этой точке, которое выглядит следующим образом:

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

Просто не забудьте включить отладку в false перед компиляцией для производства, и все, что останется, это пустой вызов pstack, который ничего не делает - кишки будут условно скомпилированы.

0 голосов
/ 27 апреля 2010

ИМХО строка или файл не добавляет много информации во Flex. Я обычно выводю имя класса и метода, и поскольку мои методы имеют тенденцию быть короткими, обычно ясно, где что-то произошло.

Если вы обнаружите, что у вас методы длиной в сотни строк, вам следует пересмотреть свой стиль кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...