web-dev-qa-db-ja.com

`throw new Error`と` throw someObject`の違いは何ですか?

私は、コードの任意のインスタンスで意図的にスローされたカスタムエラーをキャッチする共通のエラーハンドラを書きたいと思います。

次のコードのようにthrow new Error('sample')を実行したとき

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

ログはFirefoxでError: [object Object]として表示され、オブジェクトを解析できませんでした。

2番目のthrowでは、ログは次のように表示されます。Error: hehe

私がやったとき

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

コンソールはObject { hehe="haha"}のように表示され、ここでエラープロパティにアクセスできました。

違いは何ですか?

コードに見られる違いはありますか?同じような文字列は単にオブジェクトとして文字列とオブジェクトとして渡されますが、構文は異なりますか?

エラーオブジェクトをスローすることを検討していません…私は文字列をスローすることだけをしました。

上記の2つの方法以外の方法はありますか?

298

これは Errorオブジェクトとあなた自身のエラーを投げることについての良い説明です

エラーオブジェクト

エラーが発生した場合に抽出できるものは何ですか?すべてのブラウザのErrorオブジェクトは、次の2つのプロパティをサポートしています。

  • name:エラーの名前、具体的には、エラーが属するコンストラクタ関数の名前。

  • メッセージ:エラーの説明。この説明はブラウザによって異なります。

6つの可能な値がnameプロパティによって返される可能性があります。これは前述のようにエラーのコンストラクタの名前に対応します。彼らです:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

あなた自身のエラーを投げる(例外)

制御がtryブロックからcatchブロックに自動的に転送される前に6種類のエラーの1つが発生するのを待つ代わりに、それを要求に応じて発生させるために明示的に独自の例外をスローすることもできます。これは、エラーとは何か、そしていつ制御をcatchに移すべきかについての独自の定義を作成するのに最適です。

191
Hemant Metalia

次の記事では、どちらがより良い選択であるかについて、もう少し詳しく説明します。 throw 'An error'またはthrow new Error('An error')

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

Internet ExplorerやSafari(バージョンがわからない)のようなブラウザは前者を使ったときに正しくメッセージを報告しないので、後者(new Error())がより信頼できることを示唆しています。

これを行うとエラーが発生しますが、すべてのブラウザが期待したとおりに応答するわけではありません。 Firefox、Opera、およびChromeはそれぞれ「不明な例外」メッセージを表示してから、メッセージ文字列を含めます。 SafariとInternet Explorerは、単に「不明な例外」エラーをスローし、メッセージ文字列を提供しません。明らかに、これはデバッグの観点からは次善の策です。

67
Ed .

"私は悪だ"を投げる

投げます終了それ以上の実行&キャッチエラーでメッセージ文字列を公開。

try{
    throw 'I\'m Evil'
    console.log('You\'ll never reach to me', 123465)
}
catch(e){
    console.log(e); //I\'m Evil
}

throwの後のコンソールが終了の原因になることは決してありません。

新しいエラーをスローします(「私はとても甘いです」)

throw new Errorは2つのパラメータでエラーイベントを公開しますメッセージ。それはまたそれ以上の実行を終えます

try{
     throw new Error('I\'m Evil')
     console.log('You\'ll never reach to me', 123465)
}
catch(e){
        console.log(e.name, e.message); //Error, I\'m Evil
}
60

あなたは最初にこのコードに言及します:

throw new Error('sample')

それからあなたの最初の例であなたは書く:

throw new Error({'hehe':'haha'}) 

最初のErrorオブジェクトは文字列値を期待しているので、実際にはうまくいきます。この場合は 'sample'です。 2つ目は、オブジェクトを渡しようとしているためではなく、文字列が必要です。

エラーオブジェクトは "message"プロパティを持ち、それは 'sample'になります。

29
IonicBurger

あなたはオブジェクトとしてthrowすることができます

throw ({message: 'This Failed'})

その後、例えばあなたのtry/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}

または単に文字列エラーをスローします

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string
4
Mbanda

Errorコンストラクターは、エラーオブジェクトを作成するために使用されます。ランタイムエラーが発生すると、エラーオブジェクトがスローされます。 Errorオブジェクトは、ユーザー定義の例外のベースオブジェクトとしても使用できます。

ユーザー定義エラーは、throwステートメントを介してスローされます。プログラム制御は、呼び出しスタックの最初のcatchブロックに渡されます。

Errorオブジェクトを使用した場合と使用しない場合のエラーのスローの違い:


throw {'hehe':'haha'};

chromeでは、devtoolsは次のようになります。

enter image description here

Chromeは、JSオブジェクトである不明なエラーがあることを示しています。オブジェクト自体にエラーに関する情報が含まれている可能性がありますが、それがどこから来たのかすぐにはわかりません。コードを作成してデバッグしているときはあまり役に立ちません。


throw new Error({'hehe':'haha'}); 

chromeでは、devtoolsは次のようになります。

enter image description here

Errorオブジェクトでスローされたエラーは、展開時にスタックトレースを提供します。これにより、エラーが正確に発生した貴重な情報が得られますが、コードをデバッグする際に貴重な情報であることがよくあります。さらに、エラーには[object Object]と表示されることに注意してください。これは、Errorコンストラクターが最初の引数としてメッセージ文字列を予期しているためです。オブジェクトを受け取ると、強制的に文字列に変換します。

2

TLDR:それらは同等です。

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

ソース: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error

1
David Dehghan