13

ローカル HTML ファイルをロードし、いくつかの JavaScript ファイルを挿入し、ページのコンテキストでいくつかの JavaScript を実行する PhantomJS スクリプトがあります。実行するJavaScriptは例外を生成しますが、コンソールからの出力のみを取得します。これは、エラーと通常のログを区別していないようで、ファイル、行番号、またはスタックトレースがありません.

私が必要としているのは、これらのエラーをキャプチャまたは区別する方法です。私はすでに試しました:

  • PhantomJS スクリプトを try-catch でラップする
    • 結果: これに捕まるほど遠くに投げられるものは何もない
  • window.onerror関数 を定義する
    • 結果: 何も起こりません。WebKit はウィンドウに onerror イベントを実装していません

スタック トレースを取得できるように、エラー オブジェクト自体を取得できるようにしたいと考えています。

4

2 に答える 2

8

window.onerrorWebKit (https://bugs.webkit.org/show_bug.cgi?id=8519) で正しく動作しないという問題があったと思います。これがまったく修正されているかどうかはわかりません。修正されている場合、QT WebKit のバージョンが既に最新であるかどうかはわかりません。

ただし、コードでスローされた例外をキャッチできる必要があります。のようなものを使用しwebPage.evaluate(...)てコードを実行している場合、スクリプトが別のコンテキストで評価され、エラーがメインの実行コンテキストに表示されないため、完全な呼び出しを try/catch ブロックでラップすることはできません。代わりに、ページ実行コンテキストでエラーをキャッチする必要があります。残念ながら、メイン コンテキストで定義された関数にアクセスする方法はありません。そのため、実行するコードをラップするコードを明示的に記述する必要があります。

以下はphantomwebintro.js、PhantomJS ソースに含まれるファイルの変更例です。HTML ページをロードし、スクリプトを挿入してから、ページ コンテキストでコードを実行します (ここでは型エラーをスローする行があります)。このコードは try/catch ブロックでラップされ、ラップされた結果またはエラー オブジェクトをメイン コンテキストに返します。

...

// Load an HTML page:
page.open("http://www.phantomjs.org", function(status) {
    if (status == "success") {

        // Inject some scripts:
        page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {

            // Run your own code in the loaded page context:
            var resultWrapper = page.evaluate(function() {
                var wrapper = {};
                try {
                    // Your code goes here
                    // ...

                    var x = undefined.x; // force an error

                    // store your return values in the wrapper
                    wrapper.result = 42;
                } catch(error) {
                    wrapper.error = error;
                }
                return wrapper;
            });

            // Handle the result and possible errors:
            if (resultWrapper.error) {
                var error = resultWrapper.error;
                console.log("An error occurred: " + error.message);
                // continue handling the error
                // ...
            } else {
                var result = resultWrapper.result;
                // continue using the returned result
                // ...
            }

            ...

        });
    }
});

...
于 2011-12-29T18:13:14.773 に答える
2

ソリューション?return true!

      // Error tracking
      page.onError = function(msg, trace) {
          console.log('= onError()');
          var msgStack = ['  ERROR: ' + msg];
          if (trace) {
            msgStack.push('  TRACE:');
            trace.forEach(function(t) {
              msgStack.push('    -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
            }); 
          }   
          console.log(msgStack.join('\n'));

          // Consider error fully handled
          return true;
      };
于 2016-10-30T17:39:08.487 に答える