try-catch文でエラーを処理してみよう
学習の目標
本章では、以下の内容を学習します。
- try-catch文の基本構文を理解する
- エラーが発生した時の動作を学ぶ
- finallyブロックの使い方を習得する
- エラー処理の重要性を理解する
はじめに
プログラムを書いていると、時々エラーが発生することがあります。たとえば、存在しない変数を使おうとしたり、計算できない処理を実行しようとしたりした場合です。
通常、エラーが発生するとプログラムがその時点で完全に止まってしまいます。ユーザーがWebページを使っている時にプログラムが突然止まってしまうと、とても困ってしまいますよね。
そんな問題を解決するのがtry-catch文です。try-catch文を使うことで、エラーが発生しても適切に対処して、プログラムを安全に続行することができるようになります。
try-catch文は、「この処理でエラーが起きるかもしれないから注意深く実行して、もしエラーが起きたらこういう対処をしよう」という仕組みを提供してくれます。まずは基本的な使い方から一緒に学んでいきましょう。
エラーが発生するとどうなるか
まず、try-catch文を使わない場合にエラーが発生するとどうなるかを確認してみましょう。VS Codeで新しいHTMLファイルtry-catch-test.html
を作成してください。
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>try-catch文のテスト</title></head><body> <h1>try-catch文のテスト</h1> <script> console.log("プログラム開始"); console.log("正常な処理1"); // ここで存在しない変数を参照してエラーを発生させる console.log(unknownVariable); // この行以降は実行されない console.log("正常な処理2"); console.log("プログラム終了"); </script></body></html>
このHTMLファイルを保存してブラウザで開き、開発者ツールのConsoleを確認してください。エラーが発生して、その後の処理が実行されていないことが分かります。
エラーが発生すると、プログラムはその時点で止まり、その後に書かれたコードは一切実行されません。これは、ユーザーにとって不便な状況を作り出してしまいます。
try-catch文の基本的な使い方
それでは、try-catch文を使ってエラーを安全に処理してみましょう。先ほどのHTMLファイルのスクリプト部分を以下のように変更してください。
<script> console.log("プログラム開始"); console.log("正常な処理1"); try { // エラーが発生する可能性のある処理をtryブロックに書く console.log("tryブロック内の処理開始"); console.log(unknownVariable); // 存在しない変数を参照 console.log("この行は実行されません"); } catch (error) { // エラーが発生した時の処理をcatchブロックに書く console.log("エラーが発生しました: " + error.message); console.log("エラーを適切に処理しました"); } // プログラムは続行される console.log("正常な処理2"); console.log("プログラム終了");</script>
このコードを実行すると、エラーが発生してもプログラムが止まることなく、最後まで実行されることが確認できます。
try-catch文の仕組みは以下のようになっています。まず、try
ブロック内の処理が順番に実行されます。もしtry
ブロック内でエラーが発生すると、その時点でtry
ブロックの実行が中断され、すぐにcatch
ブロックに処理が移ります。
catch
ブロックでは、発生したエラーの情報を受け取ることができます。上記の例では、error
という名前でエラー情報を受け取り、error.message
でエラーの詳細なメッセージを取得しています。
try-catch文の構造を理解しよう
try-catch文の基本的な構造を詳しく見てみましょう。
try { // エラーが発生する可能性のある処理 // この中の処理は上から順番に実行される // エラーが発生すると、その時点でcatchブロックに移る} catch (error) { // エラーが発生した時だけ実行される処理 // errorにはエラーの詳細情報が含まれている}
try
ブロックには、普通に実行したい処理を書きます。ただし、その処理の中でエラーが発生する可能性がある場合に使います。
catch
ブロックは、エラーが発生した時だけ実行される特別な場所です。ここには、エラーが発生した時にどのような対処をするかを書きます。エラーが発生しなかった場合、catch
ブロックは実行されません。
エラーが発生しない場合の動作
エラーが発生しない場合の動作も確認してみましょう。HTMLファイルに以下のコードを追加してください。
<script> console.log("=== エラーが発生しない場合のテスト ==="); try { console.log("tryブロック開始"); const number1 = 10; const number2 = 5; const result = number1 + number2; console.log("計算結果: " + result); console.log("tryブロック正常終了"); } catch (error) { console.log("この行は実行されません"); } console.log("try-catch文の後の処理");</script>
この場合、try
ブロック内の処理がすべて正常に実行され、catch
ブロックは実行されません。エラーが発生しなかった場合、try-catch文は普通のコードブロックと同じように動作します。
つまり、try-catch文は「普段は普通に処理を実行するけれど、もしエラーが起きたら安全に対処する」という仕組みなのです。
エラー情報を詳しく見てみよう
catch
ブロックで受け取るエラー情報には、様々な内容が含まれています。どのような情報が取得できるかを確認してみましょう。
<script> console.log("=== エラー情報の詳細 ==="); try { console.log("エラーを発生させます"); const obj = null; console.log(obj.property); // nullオブジェクトのプロパティにアクセス } catch (error) { console.log("エラー名: " + error.name); console.log("エラーメッセージ: " + error.message); console.log("エラー全体: " + error); } console.log("エラー処理完了");</script>
エラーオブジェクトには、エラーの種類を示すname
プロパティと、具体的な内容を説明するmessage
プロパティが含まれています。これらの情報を使うことで、発生したエラーの詳細を把握し、適切な対処を行うことができます。
finallyブロックを使ってみよう
try-catch文には、さらにfinallyブロックという機能があります。finallyブロックは、エラーが発生してもしなくても、必ず実行される処理を書く場所です。
<script> console.log("=== finallyブロックのテスト ==="); function testFunction(shouldError) { console.log("関数開始"); try { console.log("tryブロック開始"); if (shouldError) { console.log("エラーを発生させます"); console.log(undefinedVariable); } else { console.log("正常処理を行います"); const result = 1 + 1; console.log("結果: " + result); } console.log("tryブロック終了"); } catch (error) { console.log("catchブロック: " + error.message); } finally { console.log("finallyブロック: この行は必ず実行されます"); } console.log("関数終了"); } console.log("--- エラーが発生しない場合 ---"); testFunction(false); console.log("--- エラーが発生する場合 ---"); testFunction(true);</script>
finallyブロックの特徴は、try
ブロックが正常に実行されても、エラーが発生してcatch
ブロックが実行されても、どちらの場合でも必ず実行されることです。
finallyブロックは、「何があっても必ず実行したい処理」を書く場所として使われます。たとえば、ファイルを開いた後に必ずファイルを閉じる処理や、データベースに接続した後に必ず接続を切断する処理などに使われます。
エラー処理の重要性を理解しよう
エラー処理をしっかりと行うことで、ユーザーにとって使いやすいWebページを作ることができます。エラー処理がある場合とない場合の違いを比較してみましょう。
<script> console.log("=== エラー処理の重要性 ==="); // エラー処理がない関数 function divideWithoutErrorHandling(a, b) { console.log("計算開始(エラー処理なし)"); const result = a / b; console.log("結果: " + result); return result; } // エラー処理がある関数 function divideWithErrorHandling(a, b) { console.log("計算開始(エラー処理あり)"); try { if (typeof a !== 'number' || typeof b !== 'number') { throw new Error("数値以外が入力されました"); } if (b === 0) { throw new Error("0で割ることはできません"); } const result = a / b; console.log("結果: " + result); return result; } catch (error) { console.log("エラーが発生: " + error.message); console.log("正しい数値を入力してください"); return null; } } console.log("--- 正常な計算 ---"); divideWithoutErrorHandling(10, 2); divideWithErrorHandling(10, 2); console.log("--- 問題のある計算 ---"); divideWithoutErrorHandling(10, 0); divideWithErrorHandling(10, 0);</script>
エラー処理がない関数では、0で割った場合にInfinity
という値が返されますが、これが正しい結果なのかユーザーには分からりません。
一方、エラー処理がある関数では、問題のある入力に対して分かりやすいメッセージを表示し、適切な値(この場合はnull
)を返しています。これにより、ユーザーは何が問題だったのかを理解し、正しい入力を行うことができます。
まとめ
本章では、try-catch文によるエラー処理について学びました。以下の内容を理解できたことと思います。
- try-catch文を使うことで、エラーが発生してもプログラムを安全に続行できる
- tryブロックにはエラーが発生する可能性のある処理を書く
- catchブロックにはエラーが発生した時の対処を書く
- finallyブロックは必ず実行される処理を書く場所
- 適切なエラー処理により、ユーザーにとって使いやすいプログラムを作ることができる
エラー処理は、安定したWebアプリケーションを作るためにとても大切な技術です。try-catch文を使うことで、予期しないエラーが発生してもユーザーに適切なメッセージを表示し、プログラムを安全に動作させることができるようになります。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。