質問するログイン新規登録

質問編集履歴

4

質問本文の一部が debug-code\.js のものに書き換わっていなかったのを修正

2015/12/15 04:13

投稿

think49
think49

スコア18194

title CHANGED
File without changes
body CHANGED
@@ -42,7 +42,7 @@
42
42
  </script>
43
43
  ```
44
44
 
45
- 今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えましたが、例外が発生していない時には行数を追えません)。
45
+ 今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えました例外が発生していない時には V8 Stack Trace API で Google Chrome のみ行数を追えましたが、他のブラウザでは行数を追えません)。
46
46
  何か上手い手立てはないものでしょうか。
47
47
 
48
48
  **(2015/12/10 01:40追記)**
@@ -54,8 +54,8 @@
54
54
 
55
55
  ###発生している問題・エラーメッセージ
56
56
 
57
- 例外エラー発生時にプログラムを強制終了しない為に `try-catch` を利用している為、コンソールに出力されるコード実行行が `return Function.apply(null, args).apply(null, getObjectValues(valiables));` の行になってしまいます。
57
+ 例外エラー発生時にプログラムを強制終了しない為に `try-catch` を利用している為、コンソールに出力されるコード実行行が `return Function.apply(null, args).apply(this, getObjectValues(valiables));` の行になってしまいます。
58
- `testCode()` を呼び出した行数をコンソールに出力したい。
58
+ `debug.test()` を呼び出した行数をコンソールに出力したい。
59
59
 
60
60
  ###補足情報(言語/FW/ツール等のバージョンなど)
61
61
 

3

「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようにしました\(Google Chromeのみ\)

2015/12/15 04:13

投稿

think49
think49

スコア18194

title CHANGED
File without changes
body CHANGED
@@ -28,7 +28,8 @@
28
28
  debug = new DebugCode({wm: wm, object: object}); // コード実行時に参照するローカル変数を指定する(プロパティ名: ローカル変数名 / プロパティ値: ローカル変数の値)
29
29
 
30
30
  debug.test('\'hoge\''); // "hoge" (※debug.console.allLog() は評価値を返す時、それが String 型なら "" で括る)
31
+ debug.console.options.useStack = true; // エラースタックを返す動作をデフォルトとする(DebugCode#test, DebugCode#console のデフォルト動作に影響)
31
- debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2}
32
+ debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2} (Google Chrome は例外なしでもエラースタック動作)
32
33
  debug.test('wm.get(object)'); // 2
33
34
  debug.test('wm.get(null)'); // undefined
34
35
  debug.test('wm.get.call(null)'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver null
@@ -36,14 +37,21 @@
36
37
  debug.test('wm.set(null, {})'); // TypeError: Invalid value used as weak map key
37
38
  debug.test('wm.set.call(null, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver null
38
39
  debug.test('wm.set.call({}, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object>
39
- debug.console.allLog(); // 全コードを評価値orエラーのコメント付で出力
40
+ debug.console.logAll(); // 全コードを評価値orエラースタックのコメント付で出力(引数未指定はデフォルトなのでエラースタック指定)
40
- debug.console.allLog(true); // 全コードを評価値orエラースタックのコメント付で出力
41
+ debug.console.logAll(false); // 全コードを評価値orエラーのコメント付で出力(デフォルト動作を上書きしてエラースタック無しを指定)
41
42
  </script>
42
43
  ```
43
44
 
44
45
  今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えましたが、例外が発生していない時には行数を追えません)。
45
46
  何か上手い手立てはないものでしょうか。
46
47
 
48
+ **(2015/12/10 01:40追記)**
49
+
50
+ Google Chrome のみ、「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようになりました。
51
+
52
+ - [Stack Trace API · v8/v8 Wiki](https://github.com/v8/v8/wiki/Stack%20Trace%20API)
53
+ - [JavaScriptStackTraceApi邦訳。Errorオブジェクトのstackについて。 | Ginpen.com](http://ginpen.com/2014/05/13/javascriptstacktraceapi/)
54
+
47
55
  ###発生している問題・エラーメッセージ
48
56
 
49
57
  例外エラー発生時にプログラムを強制終了しない為に `try-catch` を利用している為、コンソールに出力されるコード実行行が `return Function.apply(null, args).apply(null, getObjectValues(valiables));` の行になってしまいます。
@@ -74,4 +82,9 @@
74
82
  - tako-black さんに教えて頂いた `error.stack` をコードに反映しました。
75
83
  - 静的関数を止めてコンストラクタ呼び出しする事でローカル変数の指定をキャッシュするようにしました。
76
84
  - 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
77
- - `debug-code.js` を github に置きました。
85
+ - `debug-code.js` を github に置きました。
86
+
87
+ **(2015/12/10 01:40追記)**
88
+
89
+ - 「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようにしました(Google Chromeのみ)。
90
+ - JSDoc コメントを入れました。

2

debug-code\.js の記述修正

2015/12/09 16:41

投稿

think49
think49

スコア18194

title CHANGED
File without changes
body CHANGED
@@ -16,6 +16,8 @@
16
16
  例外エラーが発生するとプログラムが強制終了されますが、今回はコードの実行テストが目的なので強制終了してほしくありません。
17
17
  そこで下記コードを組みました。
18
18
 
19
+ - [debug-code.js: コードを実行し、評価値or例外エラーをプログラムを強制終了せずに返す](https://gist.github.com/think49/bfca562039aa29fa5766)
20
+
19
21
  ```HTML
20
22
  <!-- https://gist.github.com/think49/bfca562039aa29fa5766 のjsファイルを参照する -->
21
23
  <script src="debug-code.js"></script>
@@ -61,7 +63,7 @@
61
63
  - [23.3.3.3 WeakMap.prototype.get(key) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.get)
62
64
  - [23.3.3.5 WeakMap.prototype.set(key, value) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.set)
63
65
 
64
- `DebugCode` のサンプルコードを github に置きました。
66
+ `debug-code.js` を github に置きました。
65
67
 
66
68
  - [debug-code.js: コードを実行し、評価値or例外エラーをプログラムを強制終了せずに返す](https://gist.github.com/think49/bfca562039aa29fa5766)
67
69
 
@@ -72,4 +74,4 @@
72
74
  - tako-black さんに教えて頂いた `error.stack` をコードに反映しました。
73
75
  - 静的関数を止めてコンストラクタ呼び出しする事でローカル変数の指定をキャッシュするようにしました。
74
76
  - 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
75
- - `DebugCode` のサンプルコードを github に置きました。
77
+ - `debug-code.js` を github に置きました。

1

error\.stack をコードに反映しました。DebugCode を github に置きました。

2015/12/09 13:37

投稿

think49
think49

スコア18194

title CHANGED
File without changes
body CHANGED
@@ -16,40 +16,30 @@
16
16
  例外エラーが発生するとプログラムが強制終了されますが、今回はコードの実行テストが目的なので強制終了してほしくありません。
17
17
  そこで下記コードを組みました。
18
18
 
19
- ```JavaScript
19
+ ```HTML
20
- var testCode = (function (getObjectValues) {
21
- var i = 0;
22
-
23
- function testCode (code, valiables) {
24
- var args = Object.keys(valiables);
25
-
26
- args.push('try {console.log(\'code' + ++i + ': \', ' + String(code) + ');} catch (error) { console.error(error); }');
20
+ <!-- https://gist.github.com/think49/bfca562039aa29fa5766 のjsファイルを参照する -->
27
- return Function.apply(null, args).apply(null, getObjectValues(valiables));
21
+ <script src="debug-code.js"></script>
28
- }
29
-
30
- return testCode;
22
+ <script>
31
- }((function (keys, mapfn) {
32
- return function getObjectValues (object) {
33
- return keys(object).map(mapfn, object);
34
- };
35
- }(Object.keys, function mapfn (key) {
36
- return this[key];
23
+ 'use strict';
37
- }))));
38
-
39
24
  var wm = new WeakMap,
40
- object = {};
25
+ object = {},
26
+ debug = new DebugCode({wm: wm, object: object}); // コード実行時に参照するローカル変数を指定する(プロパティ名: ローカル変数名 / プロパティ値: ローカル変数の値)
41
27
 
28
+ debug.test('\'hoge\''); // "hoge" (※debug.console.allLog() は評価値を返す時、それが String 型なら "" で括る)
42
- testCode('wm.set(object, 2)', {wm: wm, object: object}); // code1: WeakMap {Object {} => 2}
29
+ debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2}
43
- testCode('wm.get(object)', {wm: wm, object: object}); // code2: 2
30
+ debug.test('wm.get(object)'); // 2
44
- testCode('wm.get(null)', {wm: wm}); // code3: undefined
31
+ debug.test('wm.get(null)'); // undefined
45
- testCode('wm.get.call(null)', {wm: wm}); // code4: TypeError: Method WeakMap.prototype.get called on incompatible receiver null
32
+ debug.test('wm.get.call(null)'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver null
46
- testCode('wm.get.call({})', {wm: wm}); // code5: TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object>
33
+ debug.test('wm.get.call({})'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object>
47
- testCode('wm.set(null, {})', {wm: wm}); // code6: TypeError: Invalid value used as weak map key
34
+ debug.test('wm.set(null, {})'); // TypeError: Invalid value used as weak map key
48
- testCode('wm.set.call(null, {}, 1)', {wm: wm}); // code7: TypeError: Method WeakMap.prototype.set called on incompatible receiver null
35
+ debug.test('wm.set.call(null, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver null
49
- testCode('wm.set.call({}, {}, 1)', {wm: wm}); // code8: TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object>
36
+ debug.test('wm.set.call({}, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object>
37
+ debug.console.allLog(); // 全コードを評価値orエラーのコメント付で出力
38
+ debug.console.allLog(true); // 全コードを評価値orエラースタックのコメント付で出力
39
+ </script>
50
40
  ```
51
41
 
52
- 今度は期待通りに動作しますが、コードの実行コードの行数がコンソールで確認できなくなってしまいました。
42
+ 今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えましたが、例外が発生していない時には行数を追えません)
53
43
  何か上手い手立てはないものでしょうか。
54
44
 
55
45
  ###発生している問題・エラーメッセージ
@@ -69,4 +59,17 @@
69
59
  例外の発生条件は ES6 仕様書を参考にしました。
70
60
 
71
61
  - [23.3.3.3 WeakMap.prototype.get(key) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.get)
72
- - [23.3.3.5 WeakMap.prototype.set(key, value) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.set)
62
+ - [23.3.3.5 WeakMap.prototype.set(key, value) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.set)
63
+
64
+ `DebugCode` のサンプルコードを github に置きました。
65
+
66
+ - [debug-code.js: コードを実行し、評価値or例外エラーをプログラムを強制終了せずに返す](https://gist.github.com/think49/bfca562039aa29fa5766)
67
+
68
+ ---
69
+
70
+ **(2015/12/09 22:35追記)**
71
+
72
+ - tako-black さんに教えて頂いた `error.stack` をコードに反映しました。
73
+ - 静的関数を止めてコンストラクタ呼び出しする事でローカル変数の指定をキャッシュするようにしました。
74
+ - 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
75
+ - `DebugCode` のサンプルコードを github に置きました。