質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

Q&A

解決済

2回答

6775閲覧

例外エラーをプログラムを強制終了せずに確認する方法

think49

総合スコア18162

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

4グッド

1クリップ

投稿2015/12/09 05:25

編集2015/12/15 04:13

###前提・実現したいこと

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 仕様書を参考にしました。

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 コメントを入れました。
usk, mhashi, naoyan, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/12/09 09:33 編集

興味もあるので回答したいのですが、来週までは時間がとれなそうです。
think49

2015/12/09 11:43

わざわざ、ありがとうございます。 急ぎの案件というわけでもありませんので、余裕のある時に回答頂ければ幸いです。
think49

2016/01/07 14:54

eripongさん。もう少し、閉じずに待とうと思っていますが、忙しさから抜けられない状態でしょうか。
eripong

2016/01/07 21:57

すみません。ちょっと調べてはみたのですが既に出ている以上のことが見つからず、そのままにしていました。もう少し調べてみます。
think49

2016/01/08 02:04

既に調べていたのですね。ありがとうございます。仮に新情報が見つからなかったとしても履歴を残していただければ幸いです。私としては調べていただいた事実だけでも有難いです。
guest

回答2

0

ベストアンサー

JavaScript

1function testCode (code, valiables) { 2 var args = Object.keys(valiables); 3 4 args.push('try {console.log(\'code' + ++i + ': \', ' + String(code) + ');} catch (error) { console.error(error.stack); }'); 5 return Function.apply(null, args).apply(null, getObjectValues(valiables)); 6 }

以上のように error.stack を使用するとスタックトレースが出力できるので、 testCode を呼び出している各行の行数が確認できるかと思います。

今回ですと
at <anonymous>: と表示されている行の右に行数が出力されると思います。
anonymous というのは無名関数のことです。

投稿2015/12/09 10:46

tako-black

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2015/12/09 11:39

ありがとうございます。 error.stack の最終行に期待する行数がありました。 ただ、この方法ですと例外が発生しないと stack を追いかけられないようです。 console.log() 出力時の行数算出はどうしようもない感じでしょうか。 (やや力技ですが、独自のエラーオブジェクトを throw すれば出来なくはなさそうですが…。)
tako-black

2015/12/09 14:31

例外が発生した際に出力されるメッセージを確認したいために、例外を発生させてメッセージを表示させていると考えていたのですが、違うということでしょうか? MDNに書いてある以上のものは無いかと思います。
think49

2015/12/09 14:43

console.log(code) と同じ結果にしたいと考えています。 console.log(wm.get(object)); // 2 console.log(wm.get.call(null)); // TypeError: Method WeakMap.prototype.get called on incompatible 例外が発生しなければ、console.log() は評価値をコンソールに出力しますが、例外が発生すれば console.log() は実行されず、TypeError が throw され、コンソールに出力されます。これと同じ結果を再現したいのです。 現状では wm.get(object) は例外が発生しない為、実行コードの行数を取得できません。 > MDNに書いてある以上のものは無いかと思います。 私も英語が堪能というわけではありませんので読み過ごしがあってはいけないと思ったのですが、やはり error.stack 以上のプロパティはないのでしょうか…。
guest

0

改めて調べてみましたが、これはというものはありませんね。

stacktrace.js
このライブラリでは各種ブラウザでのスタックトレースを取得しているので、
参考になるかもしれません。
新しい方法ではなく、taro-blackさんの回答のやり取りにもある、
エラーを出してstackを取得する方法のようです。

Firefoxについては、Chrome特権があれば、
Componentsオブジェクトが使用できるようで、
これがあると、Components.stackによってスタック情報へのアクセスが可能なようです。
通常のスクリプトでは使えず、アドオンを開発すれば取得可能な様ですが。。

投稿2016/01/08 03:35

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2016/01/08 03:42

「例外エラーをプログラムを強制終了せずに確認する方法」というより、 行番号の取得方法になっているような気がしますね。
think49

2016/01/08 15:20

Components は面白そうだと思って Firefox のコンソールで Components.stack; を叩いてみたところ、「Components オブジェクトは推奨されません。間もなく削除されます。」との警告メッセージが返ってきました。 残念ながら将来的に安心して使える機能ではないようですね…。 その後、console.trace() で行数を得られる事がわかりました。 結果をキャッシュする事は出来ませんが、知識として覚えておこうと思います。 あと、MDN のリンクに Console API のSpecificationがあるのも興味深いところです(ようやく標準化されるのでしょうか)。 https://developer.mozilla.org/ja/docs/Web/API/Console/trace > 「例外エラーをプログラムを強制終了せずに確認する方法」というより、行番号の取得方法になっているような気がしますね。 いわれてみれば確かに。 try-catch で強制終了を無効化しているので「行番号の取得方法」が目的になっていますね。
eripong

2016/01/08 22:58 編集

https://dev.mozilla.jp/addon-sdk-docs/dev-guide/tutorials/chrome.html > require("chrome") 文は、Chrome 機能や Components API にアクセスする > 唯一の方法です。Components オブジェクトには、モジュールから絶対アクセス > しないでください。SDK ツールがモジュールコードの中に Components への > 直接参照を発見した場合、警告が発生します。 とあるので、require("chrome")せずに使うと警告が出て、アドオン以外からは require("chrome")できないので、実質普通のコードでは使えないということでは 無いかと思います。 http://stackoverflow.com/questions/30375775/components-classes-error-firefox-add-onextension-in-vs-2013 にも、 > This indicates that your code is not running as an add-on. Instead it is running > as a normal "content" web page. In normal content pages, Components is > deprecated but not in an add-on. というコメントがあります。
think49

2016/01/10 01:47

ありがとうございます。Components API は完全に拡張専用の機能なのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問