職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

JS--例外が発生するエラーの種類

2024年04月03日 | 哲学

例外が発生するエラーの種類

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム

【例外が発生するえらーの種類】
例外が発生するエラーの種類として次の 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 36
toFixed メソッドでは
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

コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« JS--try...catch 文内の関数... | トップ | JS--例外をスローするには »
最新の画像もっと見る

コメントを投稿

哲学」カテゴリの最新記事