例外処理
Exception Handling
プログラム実行中に予期せぬエラー(例外)が発生した際、システムが強制終了(クラッシュ)するのを防ぎ、適切に対処して処理を継続または安全に停止させる仕組みのこと。
🐾 猫で例えると?
普段は愛嬌たっぷりでゴロンゴロンしている茶トラですが、ハンモックの上でくつろいでいる最中に上から想定外の何かが落ちてきてもパニックになりません。クルッと見上げて両手でキャッチしそうなこの体勢は、まさに予期せぬ事態に対して瞬時に身構えて被害を防ごうとする例外処理そのものです。もしキャッチしそこねても、雷が鳴った時のようにサッとソファーの下に潜り込んで致命傷を避けます。
🐾猫あるある:IT現場の日常
- おもちゃが壊れてもすぐに別のゴミで遊び始める: メイン処理でエラー(障害)が発生した際、システムを停止させず、即座に予備の代替手段やリソースに切り替えて処理を維持する「フォールバック」の仕組みです。
- 高い所から落ちそうになっても体勢を立て直す: プログラムの実行中に予期せぬ異常(例外)を検知し、専用のリカバリ処理(例外ハンドラ)を実行することで致命的なクラッシュを防ぎ、安全な状態に制御する構造です。
- 粗相をしても可愛い顔をして怒りを回避する: 内部で発生した重大なエラーやバグ(例外)を特定のキャッチ文で意図的に捕捉し、上位システムへのエラー伝播やアラートを完全に遮断して正常系に復帰させる処理です。
💻 アプリ・Web開発における「例外処理」とは?
システムは、ネットワークの一時的な切断、データベースの応答遅延、ユーザーの予期せぬ入力など、開発時には完璧に予測しきれない様々な「想定外の事態」に直面します。これらに対して何の対策もしていないと、アプリは突然フリーズしたり、画面が真っ白になったりして、ユーザーの信頼を大きく損ないます。
エンジニアは「エラーは必ず起きるもの」という前提に立ちます。エラーが起きた際にシステム全体を道連れにして落ちるのではなく、「申し訳ありません、通信に失敗しました。もう一度お試しください」といった分かりやすいメッセージを出してシステムを正常に保つために、コードの随所にこの例外処理を張り巡らせるのです。
⚠️ 例外処理の仕組みと注意点
多くのプログラミング言語では `try-catch` (または `try-except`)という構文を使います。「とりあえずこの処理をやってみて(try)、もしエラーが出たらここで捕まえて(catch)ね」という分かりやすい仕組みです。
// JavaScriptでの例外処理(try-catch)の例
try {
// まず実行を試みる処理
chatora.catchTheObject(); // 茶トラが落下物をキャッチ!
} catch (error) {
// エラー(例外)が発生した時に実行される処理
console.log("キャッチ失敗!エラー内容:" + error.message);
chatora.hideUnderSofa(); // 安全な場所へ避難
} finally {
// エラーの有無に関わらず、最後に必ず実行される処理
chatora.requestSnack(); // どっちにしろ最後はおやつを要求する
} `finally` ブロックは、エラーが起きても起きなくても必ず実行したい後片付け(開いていたファイルのクローズや、メモリの解放など)に使われます。茶トラが転んでもただでは起きないのと同じように、システムも最後は必ずクリーンな状態に戻す必要があります。
🛠️ 例外処理を賢く使うためのポイント
例外処理は非常に便利ですが、使い方を間違えると後から取り返しのつかない負債(バグの温床)になります。
- 例外のもみ消しをしない: `catch` の中で何も処理を書かないと、エラーが起きた事実そのものが闇に葬られ、後からバグの原因が全く追えなくなります。アメショに可愛い顔で誤魔化されても、システムログだけはしっかり残さなければいけません。
- 具体的な例外をキャッチする: すべてのエラーをひとまとめでキャッチするのではなく、「通信エラー」と「入力エラー」など、エラーの種類に応じた適切な `catch` ブロックを用意して個別に対処するのがベストプラクティスです。
- 通常フローの制御に使わない: 条件分岐(`if`文)で対応できる通常の処理(例:パスワードが間違っている等)を例外処理で書くと、パフォーマンスが低下し、コードが読みにくくなります。例外はあくまで「例外的な事態」のためだけに使います。
上から落ちてくるものをしっかり見据えてキャッチしようとする茶トラのように、私たちエンジニアも「どんなエラーが降ってくるか」を常に想像し、堅牢でユーザーに優しいシステムを作っていきましょう!