JavaScript - try...catch: 初心者のためのエラーハンドリングのマスター

こんにちは、将来のプログラマーたち!今日は、JavaScriptのエラーハンドリングの世界に楽しい旅に出発しましょう。プログラミングが新しいことでも心配しないでください - 私は多くの例と説明を用いて、ステップバイステップでガイドします。このチュートリアルの終わりまでに、プロのようにエラーをキャッチできるようになるでしょう!

JavaScript - try...catch

JavaScript try...catch 文

自転車に乗ることを学ぶことを思い浮かべてください。数回転ぶれるかもしれませんが、それも大丈夫です - 立ち上がって再び試みます。プログラミングでは、try...catch 文を使って同様なことをします。私たちは「試み」ていくコードを「実行」し、それが「倒れる」(エラーをスローする)と、「キャッチ」して優雅に処理します。

簡単な例を見てみましょう:

try {
// エラーを引き起こす可能性のあるコード
console.log(nonExistentVariable);
} catch (error) {
// エラーを処理するコード
console.log("おっと!エラーが発生しました:", error.message);
}

この例では、存在しない変数をログに出力しようとしています。プログラムがクラッシュする代わりに、catch ブロックがエラーをキャッチし、親切なメッセージをログします。

JavaScript try...catch...finally 文

時々、エラーが発生したかどうかに関わらず実行したいコードがあります。その場合、finally ブロックが役立ちます。まるで、「何が起ころうとも、これをやるんだ!」と言っているようなものです。

try {
console.log("ゼロで除算を試みます!");
let result = 10 / 0;
console.log("結果:", result);
} catch (error) {
console.log("ああ!エラーが発生しました:", error.message);
} finally {
console.log("これはエラーがあってもなくても常に実行されます!");
}

この例では、ゼロで除算することがエラーを引き起こしますが、finally ブロックは依然として実行されます。

JavaScript Throw 文

時々、私たち自身がエラーを作成したい时候があります。そのためには throw 文を使います。まるで、試合の判定官として、不正を见つけたら即座に反則を宣告するようなものです。

function checkAge(age) {
if (age < 0) {
throw new Error("年齢は負数にできない!");
}
console.log("年齢は有効です:", age);
}

try {
checkAge(-5);
} catch (error) {
console.log("エラーをキャッチしました:", error.message);
}

ここでは、負の年齢を使用しようとすると自分でエラーをスローしています。

Try ブロックのネスト

人形のネストのように、try...catch ブロックを互いにネストすることができます。コードの異なるレベルでエラーを処理したいときにこれは便利です。

try {
try {
throw new Error("oops!");
} catch (innerError) {
console.log("内部キャッチ:", innerError.message);
throw innerError; // エラーを再スロー
}
} catch (outerError) {
console.log("外部キャッチ:", outerError.message);
}

この例では、内部ブロックでエラーをキャッチし、ログし、それを外部ブロックに再スローしています。

エラーの再スロー

時々、エラーをキャッチして何かを行い、それを他のところで処理されるように再スローしたいときがあります。これをエラーの再スローと言います。

function doSomethingRisky() {
throw new Error("危険、ウィル・ロビンソン!");
}

try {
doSomethingRisky();
} catch (error) {
console.log("エラーをログ:", error.message);
throw error; // エラーを再スロー
}

ここでは、エラーをキャッチし、ログし、それを再スローしてコードの他の部分で処理させるいます。

条件付き Catch ブロック

時々、異なる種類のエラーを異なる方法で処理したいときがあります。キャッチブロックでエラーの種類をチェックすることでそれを行うことができます。

try {
let randomNumber = Math.random();
if (randomNumber < 0.5) {
throw new TypeError("型エラー!");
} else {
throw new RangeError("範囲エラー!");
}
} catch (error) {
if (error instanceof TypeError) {
console.log("TypeErrorを処理:", error.message);
} else if (error instanceof RangeError) {
console.log("RangeErrorを処理:", error.message);
} else {
console.log("未知のエラー:", error.message);
}
}

この例では、異なる種類のエラーを異なる方法で処理しています。

JavaScript try...catch と setTimeout() メソッド

非同期コードを扱う際、エラーハンドリングは厄介です。setTimeout() 函数でのエラー処理を見てみましょう。

try {
setTimeout(() => {
throw new Error("非同期エラー!");
}, 1000);
} catch (error) {
console.log("このブロックはエラーをキャッチしません!");
}

// 正しい方法:
setTimeout(() => {
try {
throw new Error("非同期エラー!");
} catch (error) {
console.log("非同期エラーをキャッチ:", error.message);
}
}, 1000);

最初の試みは動作しません。なぜなら、エラーがスローされるのは try...catch ブロックが実行終了した後だからです。二番目の試みは正しくエラーをキャッチします。

Promise に基づくエラー

Promise を扱う際、.catch() を使ってエラーを処理します。これは、非同期操作のキャッチブロックと似ています。

function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error("データの取得に失敗しました"));
}, 1000);
});
}

fetchData()
.then(data => console.log("データ:", data))
.catch(error => console.log("エラー:", error.message));

この例では、データの取得に失敗し、その結果としてエラーをキャッチしています。

JavaScript でのエラーの種類

JavaScriptにはいくつかのビルトインエラータイプがあります。以下にそれらをまとめた表を示します:

エラータイプ 説明
Error 一般的なエラータイプ
SyntaxError コードに構文エラーがある場合に発生
ReferenceError 存在しない変数を参照した場合に発生
TypeError 値が期待される型とは異なる場合に発生
RangeError 値が期待される範囲外にある場合に発生
URIError グローバルなURI処理関数を正しく使わない場合に発生
EvalError eval() 関数を正しく使わない場合に発生

これらのエラータイプを理解することで、より正確なエラーハンドリングコードを書くことができます。

そして、ここまででJavaScriptのエラーハンドリングのクラスを終了しました。エラーはあなたの敵ではありません - それは、より良い、より頑丈なコードを書くための貴重なフィードバックです。練習を続け、好奇心を持ち、ハッピーコーディングを!

Credits: Image by storyset