補充:這個方法只可以在flash player的debugger版本可用,
因為在一般非debugger的player無法用”e.getStackTrace()”來抓取歷史資訊
再補充:非debugger的版本只需在flex的compiler arguments裡加上
1 |
-swf-version=18 |
這串參數,就會可以正確的取得”e.getStackTrace()”的值了!
如果我們在某個函數兩要知道有關傳進的參數的相關資訊
可以使用arguments去取得
下面網址有介紹arguments的使用方式
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/arguments.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package { import flash.display.Sprite; public class ArgumentsExample extends Sprite { public function ArgumentsExample() { println("Hello World"); } public function println(str:String):void { trace(arguments.callee == this.println); // true trace(arguments.length); // 1 trace(arguments[0]); // Hello World trace(str); // Hello World } } } |
但是過去在as2裡,arguments可以用caller去知道呼叫此函數的地方
在as3裡,卻將此一屬性拿掉了。
那我們在as3裡該如何知道是誰呼叫了這個函數呢?
我在一個別人的部落格裡找到一個別人寫好的解法
是先丟出一個錯誤訊息,然後去getStackTrace(),再去解析之前呼叫者的資訊
1 2 |
try { throw new Error(); } catch ( e: Error ) { stackTrace = e.getStackTrace(); } |
原始部落格在此
Looking up the calling function
原始碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var stackTrace:String; try { throw new Error(); } catch (e:Error) { stackTrace = e.getStackTrace(); } var lines:Array = stackTrace.split("\n"); var isDebug:Boolean = (lines[1] as String).indexOf('[') != -1; var path:String; var line:int = -1; if(isDebug) { var regex:RegExp = /at\x20(.+?)\[(.+?)\]/i; var matches:Array = regex.exec(lines[2]); path = matches[1]; //file:line = matches[2] //windows == 2 because of drive:\ line = matches[2].split(':')[2]; } else { path = (lines[2] as String).substring(4); } trace(path + (line != -1 ? '[' + line.toString() + ']' : '')); |