例外処理

作成日:2013-01-26
最終更新日:

オライリーの JavaScript 第6版を図書館から借りて、 いろいろ調べている。 5 章のタイトルは文であるが、その中で出てくる例外処理は知らないので、少し調べてみた。 入力した数が自然数ならばその階乗を計算し、自然数以外ならば例外を投げるというものである。

階乗の計算:

当初のコードは次の通りだった。これでは、負の数以外の例外を捕まえていない。 なお、オリジナルの変数宣言は var だったが、これを let に変えている。 それに伴い、宣言位置も変えた。


function calculate() {
  try {
    let n = Number(prompt("正の整数を入力してください", ""));
    let f = factorial(n);
    alert(n + "!= " + f);
  }
  catch(ex) {
    alert(ex);
  }
}

function factorial(x) {
  let f;
  if (x <= 0) throw new Error("x は負では計算できません");
  for (f = 1; x > 1; f *= x, x--) {
     // do nothing
  }
  return f;
}

これを例外を捉えるように変更しなければならない。 たとえば、数値でないときには Number は NaN を返してくるのだから、 それも例外に取り込み、指定しなければならない。 また、たとえば、文字列が空のとき、小数になっているときも処理しなければならない。 そうすると、たとえば、例外を投げるところは次のようなコードにすべきだろう。


	if (isNaN(x)) throw new Error("x は自然数でなければなりません");
	if (x <= 0) throw new Error("x は負では計算できません");
	if (String(x).indexOf(".") >= 0) throw new Error("x は小数では計算できません");

おまけ

階乗の概念を拡張したガンマ関数を使えば、正負の小数、また複素数も扱える。 ただし、0 を含む実数軸上の負の整数には定義できない。

まりんきょ学問所JavaScript 手習い > 例外処理


MARUYAMA Satosi