意図的にエラーを発生させてみよう
学習の目標
本章では、以下の内容を学習します。
- throw文の使い方を理解する
- カスタムエラーの作成方法を学ぶ
- エラーメッセージの設定方法を習得する
- 適切なエラーハンドリングの考え方を理解する
はじめに
これまでの章では、予期せずに発生するエラーを処理する方法を学んできました。しかし、プログラミングでは、自分でエラーを発生させたい場面もよくあります。
たとえば、関数に渡された値が期待している範囲外だった場合や、必要な条件が満たされていない場合など、「この状況では処理を続けることができない」という時に、意図的にエラーを発生させて呼び出し元にそのことを知らせることができます。
これを可能にするのがthrow文です。throw文を使うことで、自分でエラーを作成して発生させることができます。また、エラーメッセージも自由に設定できるので、より分かりやすいエラー処理を行うことが可能になります。
自分でエラーを発生させることで、プログラムの安全性を高め、問題をより早く発見することができるようになります。
throw文の基本的な使い方
throw文は、意図的にエラーを発生させるためのJavaScriptの機能です。基本的な使い方を見てみましょう。
VS Codeで新しいHTMLファイルthrow-error-test.html
を作成してください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>throw文のテスト</title>
</head>
<body>
<h1>throw文のテスト</h1>
<script>
console.log("=== throw文の基本的な使い方 ===");
try {
console.log("処理を開始します");
console.log("何らかの問題が発生しました");
// 意図的にエラーを発生させる
throw new Error("これは意図的に発生させたエラーです");
console.log("この行は実行されません");
} catch (error) {
console.log("エラーをキャッチしました: " + error.message);
}
console.log("プログラムは継続します");
</script>
</body>
</html>
このHTMLファイルを保存してブラウザで開き、開発者ツールのConsoleを確認してください。throw文でエラーを発生させても、try-catch文で適切に処理されていることが確認できます。
throw文の基本的な構文は以下のようになります。
throw new Error("エラーメッセージ");
throw
の後にnew Error()
を書いて、括弧の中にエラーメッセージを入れます。このエラーメッセージは、catch文でerror.message
として取得することができます。
なぜエラーを意図的に発生させるのか
プログラムで意図的にエラーを発生させる理由を、具体例で理解してみましょう。
<script>
console.log("=== エラーを発生させる理由 ===");
// 年齢を受け取って成人かどうかを判定する関数
function checkAdult(age) {
// 入力値のチェック
if (typeof age !== 'number') {
throw new Error("年齢は数値で入力してください");
}
if (age < 0) {
throw new Error("年齢は0以上の数値を入力してください");
}
if (age > 150) {
throw new Error("年齢は150以下の数値を入力してください");
}
// 正常な処理
if (age >= 18) {
return "成人です";
} else {
return "未成年です";
}
}
// 正常なケースのテスト
try {
console.log("20歳の場合: " + checkAdult(20));
console.log("15歳の場合: " + checkAdult(15));
} catch (error) {
console.log("エラー: " + error.message);
}
// 異常なケースのテスト
const testCases = ["文字列", -5, 200];
testCases.forEach(testCase => {
try {
console.log(testCase + "の場合: " + checkAdult(testCase));
} catch (error) {
console.log(testCase + "でエラー: " + error.message);
}
});
</script>
この例では、関数に不適切な値が渡された時に、意図的にエラーを発生させています。これにより、以下のメリットがあります。
まず、問題のある入力値に対して明確なエラーメッセージを提供できます。ユーザーは何が間違っていたのかを具体的に知ることができます。
また、不正な値での処理を防ぐことで、予期しない結果や後続の処理でのエラーを防ぐことができます。
さらに、関数の呼び出し元で適切なエラー処理を行うことを促すことができます。
様々な条件でエラーを発生させてみよう
色々な条件でエラーを発生させる例を見てみましょう。
<script>
console.log("=== 様々な条件でのエラー発生 ===");
// 配列の要素を取得する関数
function getArrayElement(array, index) {
// 配列かどうかのチェック
if (!Array.isArray(array)) {
throw new Error("最初の引数は配列である必要があります");
}
// インデックスが数値かどうかのチェック
if (typeof index !== 'number') {
throw new Error("インデックスは数値である必要があります");
}
// インデックスが整数かどうかのチェック
if (!Number.isInteger(index)) {
throw new Error("インデックスは整数である必要があります");
}
// インデックスが範囲内かどうかのチェック
if (index < 0 || index >= array.length) {
throw new Error("インデックスが配列の範囲外です(0-" + (array.length - 1) + "の範囲で入力してください)");
}
// 正常な処理
return array[index];
}
const fruits = ["りんご", "バナナ", "オレンジ"];
// 正常なケース
try {
console.log("正常なアクセス: " + getArrayElement(fruits, 1));
} catch (error) {
console.log("エラー: " + error.message);
}
// 様々な異常ケース
const errorTests = [
{ array: "配列ではない", index: 0, description: "配列以外を渡す" },
{ array: fruits, index: "文字列", description: "インデックスに文字列" },
{ array: fruits, index: 1.5, description: "インデックスに小数" },
{ array: fruits, index: -1, description: "負のインデックス" },
{ array: fruits, index: 10, description: "範囲外のインデックス" }
];
errorTests.forEach(test => {
try {
console.log(test.description + ": " + getArrayElement(test.array, test.index));
} catch (error) {
console.log(test.description + " → " + error.message);
}
});
</script>
この例では、入力値の様々な条件をチェックして、それぞれに応じた適切なエラーメッセージを表示しています。こまかくチェックすることで、ユーザーが問題を理解しやすくなります。
カスタムエラーを作成してみよう
new Error()
以外にも、独自のエラーを作成することができます。エラーの種類を区別したい場合に便利です。
<script>
console.log("=== カスタムエラーの作成 ===");
// 計算機能の関数
function calculate(operation, a, b) {
// 入力値のチェック
if (typeof a !== 'number' || typeof b !== 'number') {
throw new TypeError("計算に使用する値は数値である必要があります");
}
// 演算の実行
switch (operation) {
case 'add':
return a + b;
case 'subtract':
return a - b;
case 'multiply':
return a * b;
case 'divide':
if (b === 0) {
throw new Error("0で割ることはできません");
}
return a / b;
default:
throw new Error("サポートされていない演算です: " + operation);
}
}
// 正常なケース
try {
console.log("足し算: " + calculate('add', 10, 5));
console.log("割り算: " + calculate('divide', 10, 2));
} catch (error) {
console.log("エラー (" + error.name + "): " + error.message);
}
// エラーのケース
const errorTests = [
{ op: 'add', a: "文字列", b: 5, description: "文字列を数値として使用" },
{ op: 'divide', a: 10, b: 0, description: "0で割る" },
{ op: 'unknown', a: 5, b: 3, description: "未知の演算" }
];
errorTests.forEach(test => {
try {
console.log(test.description + ": " + calculate(test.op, test.a, test.b));
} catch (error) {
console.log(test.description + " → " + error.name + ": " + error.message);
}
});
</script>
この例では、TypeError
と通常のError
を使い分けています。TypeError
は型に関する問題の時に使い、通常のError
はその他の問題の時に使用しています。
エラーを再発生させる
catchブロックでエラーをキャッチした後、そのエラーを再度発生させることもできます。これは、エラーを記録した後で、呼び出し元にもエラーを伝えたい場合に使われます。
<script>
console.log("=== エラーの再発生 ===");
function processData(data) {
try {
if (!data) {
throw new Error("データが提供されていません");
}
if (typeof data !== 'string') {
throw new Error("データは文字列である必要があります");
}
console.log("データを処理中: " + data);
return "処理完了: " + data.toUpperCase();
} catch (error) {
console.log("processData内でエラーを検出: " + error.message);
console.log("エラーログを記録しました");
// エラーを再発生させて呼び出し元に伝える
throw error;
}
}
function mainProcess() {
const testData = [
"正常なデータ",
null,
123
];
testData.forEach(data => {
try {
const result = processData(data);
console.log("メイン処理結果: " + result);
} catch (error) {
console.log("メイン処理でエラーを受信: " + error.message);
console.log("適切な回復処理を実行します");
}
console.log("---");
});
}
mainProcess();
</script>
この例では、processData
関数でエラーをキャッチしてログを記録した後、throw error
でエラーを再発生させています。これにより、呼び出し元のmainProcess
関数でもエラーを受け取って適切な処理を行うことができます。
まとめ
本章では、throw文を使って意図的にエラーを発生させる方法について学びました。以下の内容を理解できたことと思います。
- throw文を使うことで意図的にエラーを発生させることができる
- 不適切な入力値に対してエラーを発生させることで、プログラムの安全性を高められる
- エラーメッセージを自由に設定することで、問題の原因を明確に伝えられる
- TypeErrorなど、適切なエラーの種類を選択することでより詳細な情報を提供できる
- catchブロックでエラーを処理した後、必要に応じて再発生させることができる
意図的にエラーを発生させることは、堅牢で信頼性の高いプログラムを作るための重要な技術です。適切な場面でエラーを発生させることで、問題を早期に発見し、ユーザーに分かりやすい情報を提供することができるようになります。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。