例外が発生するエラーの種類
【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
【例外が発生するえらーの種類】
例外が発生するエラーの種類として次の 8 種類がグローバルオブジェクトとして定義されています。
例外が発生するエラーの種類として次の 8 種類がグローバルオブジェクトとして定義されています。
Error 一般的なエラー EvalError eval 関数に関するエラー InternalError JavaScriptの内部エラー RangeError 数値が有効範囲を超えた場合のエラー ReferenceError 不正な参照を行った場合のエラー SyntaxError JavaScriptの構文エラー TypeError 変数や引数の型が適切ではない場合のエラー URIError encodeURIまたはdecodeURIに関するエラー
※ ただし SyntaxError は実行時にエラーとなるのではなく実行前の時点でエラーとなるため、明示的に SyntaxError オブジェクトを作成してスローしない限りは、構文ミスが理由で実行時に例外をスローすることはないと思います。
例文
let num = 10; console.log(num.toString(100));//toStringの引数は 2 から 36 までの範囲実行> RangeError: toString() radix argument must be between 2 and 36toFixed メソッドでは
let num = 3.14; console.log(num.toFixed(1000));//引数の範囲は、0から100まで実行 > RangeError: toFixed() digits argument must be between 0 and 100 let str = '3.14'; console.log(str.toFixed());実行 > TypeError: str.toFixed is not a function console.log(24.toFixed());実行 > SyntaxError: Invalid or unexpected token
【例外の種類に応じて実行する処理を分ける】
例外の種類が何であっても同じ処理を行いたい場合は次のように記述します。
サンプル
function returnFixed(num, digits){ try{ return num.toFixed(digits) } catch(e) { console.error(e); return null; } } console.log('Start'); console.log(returnFixed(3.87654, 3)); console.log(returnFixed(3.87654, 1000)); console.log(returnFixed('3.87654', 1000)); console.log('End'); 実行 > Start > 3.877 > RangeError: toFixed() digits argument must be between 0 and 100 > null > TypeError: num.toFixed is not a function> null > End
今回のサンプルでは try...catch 文が記述された外部の関数を 3 回呼び出しています。
1 回目は正常に結果が返ってきますが、 2 回目と 3 回目はそれぞれ例外が発生しています。
2 回目と 3 回目では発生した例外の種類が異なりますが同じ catch ブロック内で同じ処理を行っています。
発生した例外の種類毎に実行する処理を分けたい場合、 catch のあとの括弧の中に記述した変数 e に格納されている値を調べて条件分岐を行います。
try{ 例外が発生する可能性がある文を記述 ・・・ } catch(e) { if (e instanceof RangeError){ // RangeError が発生した場合に実行される処理 ・・・ } else if (e instanceof TypeError){ // TypeError が発生した場合に実行される処理 ・・・ } else { // 上記以外の例外が発生した場合に実行される処理 ・・・ } }
catch のあとの変数には例外がスローされたときに設定された値が格納されます。この値を instanceof 演算子を使って RangeError オブジェクトや TypeError オブジェクトと比較することで例外の種類を特定することができます。
サンプル
function returnFixed(num, digits){ try{ return num.toFixed(digits) } catch(e) { if (e instanceof RangeError){ console.error('RangeError'); return null; } else if (e instanceof TypeError){ console.error('TypeError'); return null; } else { console.error(e); return null; } } } console.log('Start'); console.log(returnFixed(3.87654, 3)); console.log(returnFixed(3.87654, 1000)); console.log(returnFixed('3.87654', 1000)); console.log('End'); 実行 > Start > 3.877 > RangeError > null > TypeError > null > End
※コメント投稿者のブログIDはブログ作成者のみに通知されます