9

私は次のコーヒースクリプトコードを持っています:

try
   do something
catch error
   log something
   throw error

throw new Error(error)代わりに使用する必要がありthrow errorますか?

違いはなんですか?

4

1 に答える 1

17

C#やJavaなどの他の言語と同じです。

  • throw error同じErrorオブジェクトをスローします
  • throw new Error(error)それを新しいErrorオブジェクトにラップします。後者は、たとえばJavaで、チェックされた例外をチェックされていない例外に変換する必要がある場合に使用されます。JavaScriptでは、例外をラップする必要はありません。これにより、スタックトレースが少し長くなり、見栄えが悪くなります。

編集:セキュリティにもいくつかの影響があります。次に例を示します。

function noWrap() {
    try {
        var o = {}; o.nonexistingMethod();
    } catch (error) {
        throw error;
    }
}

function wrap() {
    try {
        var o = {}; o.nonexistingMethod();
    } catch (error) {
        throw new Error(error);
    }
}

呼び出すnoWrap()と、次のエラーメッセージが表示されます。

"TypeError: Object #<Object> has no method 'nonexistingMethod'"
// with error.arguments === ['nonexistingMethod', o]

呼び出すwrap()と、次のエラーメッセージが表示されます。

"Error: TypeError: Object #<Object> has no method 'nonexistingMethod'"
//  with error.arguments === undefined

したがって、ラッピングErrorオブジェクトを使用してわかるようにarguments、元のエラーを非表示にすることができます。次のいずれかを書いているとします。

  • ある種の図書館
  • 自分が所有していないページに読み込まれるスクリプト(たとえば、ある種のいいねボタンやツイートボタン)
  • サードパーティのスクリプト(ソーシャルボタン、広告、トラッキングコードなど)が読み込まれているページ上のスクリプト

上記のすべての場合において、安全を確保するために、オブジェクトをラップする必要があり ます。そうしないと、内部オブジェクト、関数、および変数への参照が誤ってリークされる可能性があります。Error

編集2:スタックトレースについて。どちらのバリアントもそれらを保持します。これが実際の例で、Chromeで次のスタックトレースを取得します。

// No wrapping:
TypeError: Object #<Object> has no method 'nonexistingMethod'
    at noWrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:22:23)
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:37:5
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20

// Wrapping:
Error: TypeError: Object #<Object> has no method 'nonexistingMethod'
    at wrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:32:15)
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:44:5
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20 
于 2012-06-11T09:15:16.377 に答える