web-dev-qa-db-ja.com

JavaScriptで例外をログに記録する方法

C#開発者として、私は次のスタイルの例外処理に慣れています。

try
{
    throw SomeException("hahahaha!");
}
catch (Exception ex)
{
    Log(ex.ToString());
}

Output
------

SomeNamespace.SomeException: hahahaha!
    at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27

本当にシンプルですが、例外が何で、どこにあったかについて知る必要があるすべてを教えてくれます。

例外オブジェクト自体が単なる文字列である可能性があるJavaScriptで同等のことを実現するにはどうすればよいですか。例外が発生したコードの正確な行を知りたいのですが、次のコードは有用なものをまったくログに記録しません。

try
{
    var WshShell = new ActiveXObject("WScript.Shell");
    return WshShell.RegRead("HKEY_LOCAL_MACHINE\\Some\\Invalid\\Location");
}
catch (ex)
{
    Log("Caught exception: " + ex);
}

Output
------

Caught exception: [object Error]

[〜#〜] edit [〜#〜](再び):明確にするために、これはJavaScriptを多用する内部アプリケーション用です。実動システムでキャッチされる可能性のあるJavaScriptエラーから有用な情報を抽出する方法を探しています-私はすでにログメカニズムを持っていますが、適切な文字列をログに記録する方法が必要です。

23
Justin

ほぼ同じように使用できます。

try
{
    throw new Error("hahahaha!");
}
catch (e)
{
    alert(e.message)
}

しかし、エラーがスローされた行番号とファイル名を取得したい場合は、クロスブラウザーの解決策はないと思います。メッセージと名前は、Errorオブジェクトの唯一の標準プロパティです。 mozillaには、lineNumberプロパティとfileNameプロパティもあります。

8
Eldar Djafarov

ブラウザとサーバーのどちらで作業しているかは指定しません。前者の場合、新しい console.error メソッドと e.stack プロパティがあります。

try {
    // do some crazy stuff
} catch (e) {
    console.error(e, e.stack);
}

エラーはFirefoxとChromeで機能しますが、標準ではないことに注意してください。 console.logにダウングレードし、e.stackがない場合はeをログに記録する簡単な例:

try {
    // do some crazy stuff
} catch (e) {
    (console.error || console.log).call(console, e.stack || e);
}
31
Nacho Coloma

Eldarが指摘しているように、e.messageを使用して例外のメッセージを取得できます。ただし、Chrome、Firefox、IE10 +では、e.stackを使用してスタックトレースを取得することもできます。スタックトレースには、例外のファイルと行番号が含まれます。

したがって、例外情報を使用して文字列をアセンブルするには、次のように記述します。

var exmsg = "";
if (e.message) {
    exmsg += e.message;
}
if (e.stack) {
    exmsg += ' | stack: ' + e.stack;
}

スタックトレースは、次の場合にのみ取得されることに注意してください。

  1. 例外がブラウザによってスローされました(構文エラーへの応答など)。
  2. 例外オブジェクトはErrorオブジェクトであるか、プロトタイプとしてErrorオブジェクトを持っています。

したがって、文字列をスローする(「Exception !!」をスローする)だけでは、スタックトレースは得られません。

これをもう少し進めて、キャッチされなかったすべての例外をキャッチするには、window.onerrorハンドラー(global.asaxの.Net Application_Errorハンドラーと同様)を使用します。これの欠点は、これが実際の例外オブジェクトへのアクセスを提供しないため、スタックトレースを取得できなかったことです(そしてほとんどの場合、今でもそうです)。メッセージ、URL、行番号のみが表示されます。

最近、標準が拡張され、列(縮小されたファイルに最適)と例外オブジェクトも提供されるようになりました: http://www.whatwg.org/specs/web-apps/current-work/multipage /webappapis.html#errorevent

現在(2014年4月)、Chrome 32のみがこれをすべて実装しています。IE10+は列を提供しますが、例外オブジェクトは提供しません。Firefox28は、メッセージ、URL、行番号のみを提供します。うまくいけば、すぐに改善されます。これについては、JSNLogプロジェクトについて次のように書いています。 http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(免責事項:私はJSNLogとjsnlog.comの作成者です)

次に、.NetExceptionオブジェクトは内部例外をサポートします。また、Dataプロパティもあるため、キーと値のペアを変数値などに添付できます。 JavaScript Errorオブジェクトでそれを見逃したので、JSNLogプロジェクトの一部として独自のExceptionオブジェクトを作成しました。これは、jsnlog.js Githubプロジェクトのjsnlog.jsファイルにあります( https://github.com/mperdeck/jsnlog.js )。

説明は次のとおりです: http://jsnlog.com/Documentation/JSNLogJs/Exception

最後に、恥知らずなプラグインです。私が取り組んでいるJSNLogプロジェクトでは、JavaScriptにロガーを挿入し、既存のサーバー側のログにログメッセージを自動的に挿入できます。したがって、JavaScript例外とそのスタックトレースをサーバー側のログに記録するには、次のように記述するだけです。

try {
    ...
} catch (e) {
    JL().fatalException("something went wrong!", e);
}
21
user1147862

それがクロスブラウザであるかどうか、またはそれがあなたが探しているものであるかどうかはわかりませんが、試してみることをお勧めします:

window.onerror = function (err, file, line) {
    logError('The following error occurred: ' + 
    err + '\nIn file: ' + file + '\nOn line: ' + line);
    return true;
}
2
mahju

Yahoo!UIライブラリ-ロガー などのログツールを使用して、エラー/情報メッセージをログに記録できます。

0
Kirtan
0
Quentin