オライリーの 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 手習い > 例外処理