1. ホーム
  2. ジャバスクリプト

[解決済み】 `throw new Error` と `throw someObject` の違いは何ですか?

2022-03-23 01:46:42

質問

コードの任意のインスタンスで意図的に投げられたカスタムエラーをキャッチする共通のエラーハンドラを書きたいのです。

をしたとき 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つの方法以外に何か方法はありますか?

どのように解決するのですか?

javascriptの「throw new Error」と「throw someObject」の違いは、throw new Errorは、渡されたエラーを以下のような形式でラップすることです。

{ name: 'Error', message: 'コンストラクタに渡した文字列' }

throw someObject はオブジェクトをそのまま投げ、try ブロックからのそれ以上のコード実行を許さない、つまり throw new Error と同じです。

については、以下のような説明があります。 Error オブジェクトと独自のエラーを投げる

エラーオブジェクト

エラー発生時に何を取り出せばいいのでしょうか?すべてのブラウザのErrorオブジェクトは、以下の2つのプロパティをサポートしています。

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

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

nameプロパティで返される値は6つあり、前述のようにエラーのコンストラクターの名前に対応しています。それらは次のとおりです。

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()).

独自のエラー(例外)を投げる

6種類のエラーのいずれかが発生するのを待ってから、tryブロックからcatchブロックに自動的に制御を移すのではなく、明示的に独自の例外をスローして、オンデマンドでエラーを発生させることも可能です。これは、エラーとは何か、いつcatchに制御を移すべきかの定義を独自に作成するのに適しています。