私は次のコーヒースクリプトコードを持っています:
try
do something
catch error
log something
throw error
throw new Error(error)
代わりに使用する必要がありthrow error
ますか?
違いはなんですか?
私は次のコーヒースクリプトコードを持っています:
try
do something
catch error
log something
throw error
throw new Error(error)
代わりに使用する必要がありthrow error
ますか?
違いはなんですか?
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