HTML Living Standard  第3部 Javascript 4 条件文とエラー処理


 

4 条件文とエラー処理

4.1  条件文

条件文は、指定した条件が true ならば実行される命令の集まりです。JavaScript は if 文と switch 文の 2 つの条件文をサポートしています。

なお、以下の値は false に評価されます(その他は true に評価されます)。

4.1.1 if 文

条件を評価し条件に応じてた処理を実行します。条件をさらに指定したい場合は、else if 文を続けて処理を分岐させることも可能です。また、すべての条件が false の場合に処理を行いたい場合は、else 文を指定します。

if 命令

条件を評価し条件に応じてた処理を実行する。

if (条件1) {
  処理1;     // 条件1 が true の場合の処理
}
else if (条件2) {
  処理2;     // 条件2 が true の場合の処理
}
else {
  処理3;     // すべての条件が false の場合の処理
}

4.1.2 switch 文

式がラベルと一致したときに、一致したラベルにある処理を実行します。いずれのラベルにも一致しない場合は、default に指定した処理が実行されます。

処理の最後には、break 文を使用して、処理を終了する必要があります。 break 文を記述しないと、次のラベルの処理も実行されてしまうので注意して下さい。

switch 命令

式がラベルと一致したときに、一致したラベルにある処理を実行する。

switch (式) {
  case ラベル1:
    処理1;     // 式 が ラベル1 の場合の処理
  case ラベル2:
    処理2;     // 式 が ラベル2 の場合の処理
  default:
    処理3;     // 式 が すべてのラベルと一致しなかった場合の処理
}

4.2  例外処理文

例外処理とは、プログラムに異常が発生した場合に現在の処理を中断し、エラーメッセージを表示するなどの処理を行うことをいいます。

Javascript は、次のような例外を発生する可能性があります。

クラス発生する場面
EvalErrorグローバル関数 eval() が不適切に使用された場合
InternalErrorJavaScriptエンジン内部で起きた場合
RangeError関数に対して引数として許容されない範囲の数値を渡そうとした場合
ReferenceError宣言されていない変数を読み出そうとした場合
SyntaxErrorコードをパース中に言語の構文に従わないトークン又はトークン順序に遭遇した場合
TypeErrorある演算子又は関数が期待する型と互換性の無いオペランド又は引数がその関数に渡された場合
URIError奇妙な形のURIに遭遇した場合

また、throw 文によって独自の例外を発生させることもできます。

4.2.1 throw 文

明示的に例外を発生させることができます。例えば、エラーの種類により処理を変えたい場合等に使用します。

throw 命令

明示的に例外を発生する。

throw 式;

式には、スローしたい、さまざまな型の値を指定することができます。

記述例
  throw "Error";                  // 文字列
  throw 31;                       // 数値
  throw true;                     // 真偽値
  throw new MyError("Error");     // オブジェクト

MyError のような独自のオブジェクト型を指定することもできます。例えば、MyError は次のように記述します。

記述例
function MyError (message){
  this.message=message;
  this.name="MyError";
}

4.2.2 try 文

try 文のブロックには、例外を発生するかもしれない文を記述し、さらにスローされる例外を受け取る catch 文か、try ブロックの後で必ず実行される finally 文が必要です。

try ブロック内のいずれかの文が例外をスローすると、制御は catch ブロックがあればすぐに catch ブロックに移ります。try ブロックで例外がスローされなかった場合は、try ブロックが最後まで実行され catch ブロックはスキップされます。そして、例外が発生してもしなくても finally 文が実行されます。

try 命令

例外を発生するかもしれない文を記述する。

try {
  文;
}
記述例
try {
  rate = x / 100;      // x が未定義なので、例外をスローする
  document.getElementById("d").textContent=rate;        // 例外が発生すると実行されない
}
catch (e) {
  document.getElementById("d").textContent=e.message;   // 例外が発生すると実行される
}
表示例

4.2.3 catch 文

try ブロックでスローされた値を変数に受け取ります。投げられた例外についての情報を得るために、この変数を使うことができます。

Javascript が標準で発生させる例外(TypeError、RangeError など)には message というプロパティがあり、エラー理由を知ることができます。

例外の種類により処理を分けたい場合は catch ブロックの中で if 文などで分岐させます。

catch 命令

try ブロックでスローされた値を変数に受け取る。

catch (変数) {
  文;
}
記述例
function oneSeveralth(denominator) {
  if (isNaN(denominator)) {   // 数値でない
    throw new TypeError("Not a Number");
  }
  if (denominator == 0) {     // ゼロ
    throw new RangeError("Devide by 0");
  }
  return 1 / denominator;
}


try {
  var rate = oneSeveralth(0);      // この関数が例外をスローする
  document.getElementById("d").textContent=rate;        // 例外が発生すると実行されない
}
catch (e) {
  if (e instanceof TypeError) {             // 例外が発生すると実行される
    document.getElementById("d").textContent="TypeError(" + e.message + ")";
  }
  else if (e instanceof RangeError) {
    document.getElementById("d").textContent="RangeError(" + e.message + ")";
  }
  else {
    document.getElementById("d").textContent=e.message;
  }
}
表示例

4.2.4 finally 文

try ブロックで例外が発生したかどうかにかかわらず、try ブロックや catch ブロックの実行が終わった後に実行されます。

finally 命令

try ブロックや catch ブロックの実行が終わった後に実行する文を記述する。

finally {
  文;
}
記述例
try {
  rate = x / 100;      // x が未定義なので、例外をスローする
  document.getElementById("d").textContent=rate;        // 例外が発生すると実行されない
}
catch (e) {
  document.getElementById("d").textContent=e.message;   // 例外が発生すると実行される
}
finally {
  dispose();   // 例外が発生したかどうかにかかわらず必ず実行される
}