スタックトレースを取得
Google Chrome 10.0.648.204で確認
方法1: Error#stackプロパティから取得 (ただし文字列形式なのでパースが必要)
スタックトレースの出力形式
例外クラス名※1: メッセージ※2 at 例外が発生したメソッド名※3 (メソッドが呼び出されたファイル名:行番号※4:位置※5)※6 at 例外が発生したファイル名:行番号※4:位置※5
※注釈 [1]例外クラス名 Error#nameプロパティの値 [2]メッセージ Error#messageプロパティの値 [3](省略) コンストラクタの場合、"new メソッド名"となる [4]行番号 例外が発生したメソッド/コンストラクタの行番号(1〜) [5]位置 例外が発生したメソッド/コンストラクタの最初の1文字の位置(1〜) [6](省略) この行はネストしているメソッドの数だけ増える (0行〜)
// スタックトレースを取得 function Hoge(){ function Fuga(){ throw new Error('えらー'); } return new Fuga(); } try{ Hoge(); }catch(e){ var raw_stacktrace = e.stack; var stacktrace = parse_stacktrace(raw_stacktrace); } // スタックトレースを出力 console.log('生のスタックトレース'); console.log(raw_stacktrace); console.log(''); console.log('加工後のスタックトレース'); console.log(JSON.stringify(stacktrace, null, 2)); console.log(''); console.log('get_stacktrace()'); console.log(JSON.stringify(get_stacktrace(), null, 2)); /** Error#stack()のスタックトレース文字列をパース * @param {string} Error#stack()の戻り値 * @return {Array} スタックトレース */ function parse_stacktrace(st){ var res = []; var traces = st.split(/\r\n?|\n/).slice(1); for( var i=0, l=traces.length-1; i < l; ++i ){ var m = /^\s*at\s+((?:new\s+)?[$_a-z][$\w]*)\s+\(([\s\S]+\/)([^\/]+):(\d+):(\d+)\)$/i.exec(traces[i]); res[i] = { method: m[1], dir: m[2], fname: m[3], path: m[2]+m[3], line: m[4], pos: m[5] }; } var m = /^\s*at\s+([\s\S]+\/)([^\/]+):(\d+):(\d+)$/.exec(traces[traces.length-1]); res[res.length] = { dir: m[1], fname: m[2], path: m[1]+m[2], line: m[3], pos: m[4] }; return res; } /** スタックトレースを取得 */ function get_stacktrace(){ var st = new Error().stack.split(/\r\n?|\n/).slice(2), res = []; for( var i=0, l=st.length-1; i < l; ++i ){ var m = /^\s*at\s+((?:new\s+)?[$_a-z][$\w]*)\s+\(([\s\S]+\/)([^\/]+):(\d+):(\d+)\)$/i.exec(st[i]); res[i] = {method: m[1], dir: m[2], fname: m[3], path: m[2]+m[3], line: m[4], pos: m[5]}; } var m = /^\s*at\s+([\s\S]+\/)([^\/]+):(\d+):(\d+)$/.exec(st[st.length-1]); res[res.length] = {dir: m[1], fname: m[2], path: m[1]+m[2], line: m[3], pos: m[4]}; return res; }
実行結果 (Google Chrome 10.0.648.204で確認)
生のスタックトレース Error: えらー at new Fuga (file:///C:/fakepath/get_stacktrace.js:34:9) at Hoge (file:///C:/fakepath/get_stacktrace.js:36:9) at file:///C:/fakepath/get_stacktrace.js:40:2 加工後のスタックトレース [ { "method": "new Fuga", "dir": "file:///C:/fakepath/", "fname": "get_stacktrace.js", "path": "file:///C:/fakepath/get_stacktrace.js", "line": "34", "pos": "9" }, { "method": "Hoge", "dir": "file:///C:/fakepath/", "fname": "get_stacktrace.js", "path": "file:///C:/fakepath/get_stacktrace.js", "line": "36", "pos": "9" }, { "dir": "file:///C:/fakepath/", "fname": "get_stacktrace.js", "path": "file:///C:/fakepath/get_stacktrace.js", "line": "40", "pos": "2" } ] get_stacktrace() [ { "dir": "file:///C:/fakepath/", "fname": "get_stacktrace.js", "path": "file:///C:/fakepath/get_stacktrace.js", "line": "56", "pos": "28" } ]
方法2: console.trace()から取得
未調査です