###前提・実現したいこと
ES6 の WeakMap()
の例外メッセージを確認する為に Google Chrome 47.0.2526.80m で下記コードを実行しました。
JavaScript
1var wm = new WeakMap; 2 3wm.get(null); // undefined 4wm.get.call(null); // TypeError: Method WeakMap.prototype.get called on incompatible receiver null 5wm.get.call({}); // TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object> 6wm.set(null, {}); // TypeError: Invalid value used as weak map key 7wm.set.call(null, {}, 1); // TypeError: Method WeakMap.prototype.set called on incompatible receiver null 8wm.set.call({}, {}, 1); // TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object>
例外エラーが発生するとプログラムが強制終了されますが、今回はコードの実行テストが目的なので強制終了してほしくありません。
そこで下記コードを組みました。
HTML
1<!-- https://gist.github.com/think49/bfca562039aa29fa5766 のjsファイルを参照する --> 2<script src="debug-code.js"></script> 3<script> 4'use strict'; 5var wm = new WeakMap, 6 object = {}, 7 debug = new DebugCode({wm: wm, object: object}); // コード実行時に参照するローカル変数を指定する(プロパティ名: ローカル変数名 / プロパティ値: ローカル変数の値) 8 9debug.test('\'hoge\''); // "hoge" (※debug.console.allLog() は評価値を返す時、それが String 型なら "" で括る) 10debug.console.options.useStack = true; // エラースタックを返す動作をデフォルトとする(DebugCode#test, DebugCode#console のデフォルト動作に影響) 11debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2} (Google Chrome は例外なしでもエラースタック動作) 12debug.test('wm.get(object)'); // 2 13debug.test('wm.get(null)'); // undefined 14debug.test('wm.get.call(null)'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver null 15debug.test('wm.get.call({})'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object> 16debug.test('wm.set(null, {})'); // TypeError: Invalid value used as weak map key 17debug.test('wm.set.call(null, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver null 18debug.test('wm.set.call({}, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object> 19debug.console.logAll(); // 全コードを評価値orエラースタックのコメント付で出力(引数未指定はデフォルトなのでエラースタック指定) 20debug.console.logAll(false); // 全コードを評価値orエラーのコメント付で出力(デフォルト動作を上書きしてエラースタック無しを指定) 21</script>
今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに error.stack
を教えていただいた事で例外発生時には該当行を終えました。例外が発生していない時には V8 Stack Trace API で Google Chrome のみ行数を追えましたが、他のブラウザでは行数を追えません)。
何か上手い手立てはないものでしょうか。
(2015/12/10 01:40追記)
Google Chrome のみ、「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようになりました。
###発生している問題・エラーメッセージ
例外エラー発生時にプログラムを強制終了しない為に try-catch
を利用している為、コンソールに出力されるコード実行行が return Function.apply(null, args).apply(this, getObjectValues(valiables));
の行になってしまいます。
debug.test()
を呼び出した行数をコンソールに出力したい。
###補足情報(言語/FW/ツール等のバージョンなど)
下記環境で確認しています。
OS: Windows 7 Home Premium SP1 64bit Browser: Google Chrome 47.0.2526.80m
例外の発生条件は ES6 仕様書を参考にしました。
- 23.3.3.3 WeakMap.prototype.get(key) – ECMA-262 6th Edition
- 23.3.3.5 WeakMap.prototype.set(key, value) – ECMA-262 6th Edition
debug-code.js
を github に置きました。
(2015/12/09 22:35追記)
- tako-black さんに教えて頂いた
error.stack
をコードに反映しました。 - 静的関数を止めてコンストラクタ呼び出しする事でローカル変数の指定をキャッシュするようにしました。
- 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
debug-code.js
を github に置きました。
(2015/12/10 01:40追記)
- 「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようにしました(Google Chromeのみ)。
- JSDoc コメントを入れました。
回答2件
あなたの回答
tips
プレビュー