[解決済み】 `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つの方法以外に何か方法はありますか?
どのように解決するのですか?
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に制御を移すべきかの定義を独自に作成するのに適しています。
関連
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み】JavaScript版sleep()とは?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み】JavaScript "Uncaught TypeError: object is not a function" 連想性の質問
-
[解決済み] テスト
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】PhantomJS 2.1.1を使用してReactJSアプリケーションをレンダリングできない理由とは?
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?