JavaScriptでプログラムを作成していると、予期しないエラーが発生した場合に処理を止めたい場面があります。しかし、try catchを使ってもエラー表示後に処理が続いてしまうことがあり、どのように終了させればよいのか迷う方も少なくありません。
JavaScriptには、他のプログラミング言語のような単純な「プログラム終了命令」はありません。そのため、エラー処理の目的に応じて、例外を発生させる方法や処理を中断する方法を使い分ける必要があります。
JavaScriptのtry catchはエラー処理であり終了処理ではない
JavaScriptのtry catchは、エラーが発生した場合にプログラムを強制終了するための機能ではありません。try内で発生した例外をcatchで受け取り、その後に別の処理を行うための仕組みです。
例えば、以下のようなコードでは、throwによってエラーを発生させていますが、catchブロックでエラーを処理した後は、その下に書かれた処理が続けて実行されます。
つまり、catchに入った時点でエラーは処理済みとして扱われるため、「エラーが出たら自動的に終了する」という動作にはなりません。
処理を途中で止めたい場合はreturnを利用する
関数の中で処理を終了したい場合は、returnを使う方法が一般的です。returnを実行すると、その関数内の処理はそこで終了します。
例えば、入力値が正しくない場合に処理を止めたい場合は、次のような書き方ができます。
function sample(value){if(value === null){console.log("入力エラーです");return;}console.log("処理を続行します");}
この場合、valueがnullならreturnによって後続の処理には進みません。Webサイトのフォーム処理やデータチェックなどでよく利用される方法です。
エラーを発生させて呼び出し元へ伝える方法
処理を終了するのではなく、「この処理では対応できないエラーが発生した」と上位の処理へ知らせたい場合はthrowを利用します。
例えば、関数内で異常を検出した場合は以下のように書くことができます。
function checkNumber(num){if(typeof num !== "number"){throw new Error("数値ではありません");}return num;}
このthrowされたエラーは、その関数を呼び出した側のtry catchで受け取ることができます。大規模なプログラムでは、このようにエラーを上位へ伝える設計がよく使われます。
ブラウザ上のJavaScriptで完全終了することはできるのか
Webブラウザで動作するJavaScriptの場合、基本的にプログラム全体を終了させる命令はありません。ブラウザはページやユーザー操作を管理しているため、JavaScript側から強制的にブラウザ処理を終了させる仕組みにはなっていません。
そのため、異常が発生した場合は「必要な処理を実行しない」「関数をreturnする」「例外をthrowする」といった方法で制御します。
例えば、ボタンを押した時の処理でエラーが発生した場合でも、ページ自体を終了するのではなく、そのイベント処理だけを停止するという考え方になります。
Node.jsの場合はprocess.exit()で終了できる
JavaScriptでもNode.jsのようなサーバー環境では、process.exit()を利用してプロセスを終了できます。
console.log("エラー発生");process.exit(1);console.log("この処理は実行されません");
ただし、process.exit()は強制終了になるため、ファイル保存やデータベース処理など終了前に必要な処理がある場合は注意が必要です。
Webブラウザで動くJavaScriptと、Node.jsなどサーバー側で動くJavaScriptでは、利用できる終了処理が異なる点を理解しておくことが重要です。
エラー処理を正しく設計するポイント
JavaScriptでは、すべてのエラーでプログラム全体を止める設計にするよりも、問題が発生した場所だけを適切に停止させる考え方が一般的です。
例えば、ユーザー入力に問題がある場合はメッセージを表示して再入力を促し、システム内部の重大な問題の場合はthrowで上位処理へ通知するなど、状況によって対応を変えます。
「エラーが起きたら終了する」のではなく、「エラー発生後にどの処理まで続けるべきか」を考えることが、安定したJavaScriptプログラムを作るポイントです。
まとめ
JavaScriptのtry catchは、エラーを捕まえて処理する仕組みであり、プログラムを自動的に終了させる機能ではありません。
処理を止めたい場合はreturn、エラーを通知したい場合はthrow、Node.js環境でプロセス自体を終了したい場合はprocess.exit()を使うなど、目的に合わせた方法を選択する必要があります。
JavaScriptでは環境によって終了の考え方が異なるため、ブラウザ用プログラムなのかサーバー用プログラムなのかを確認しながらエラー処理を設計することが大切です。


コメント