バグを出す前に例外を予見する!不測の事態に強いエンジニアの思考プロセスとは?

公開日: 2026-04-04

プログラミングを学び始めたばかりの頃、私たちは「正しく動くこと」だけを考えてコードを書きがちです。 しかし、いざ自分のプログラムを誰かに使ってもらうと、思いもよらない場所でエラーが発生して止まってしまいます。

それは、あなたが書いたロジックが間違っているからではなく、現実世界の「不確実性」を考慮できていないからです。 一流のエンジニアは、コードを書く瞬間に「もしここが動かなかったらどうなるか?」という不測の事態を常に予見しています。

今回は、バグを未然に防ぐための「例外を予見する思考プロセス」について、IT初心者の方にもわかりやすくお伝えします。 この思考法を身につけることで、あなたのコードは驚くほど頑丈になり、周囲からの信頼も一気に高まるはずです。

ハッピーパスの幻想を捨てる

プログラミングにおいて、すべての入力が完璧で、ネットワークも安定し、すべてが理想通りに進む状況をハッピーパスと呼びます。 初心者が最初に書くコードの多くは、このハッピーパスしか通れない、とても繊細なガラス細工のようなものです。

しかし、現実の開発現場は、晴天ばかりではありません。

ユーザーは予期せぬ文字を入力しますし、インターネットは突然途切れますし、保存しようとしたディスクがいっぱいであることもあります。

エンジニアとして成長するための第一歩は、このハッピーパスの幻想を捨て、嵐の中でも進めるコードを書く決意をすることです。 まずは、物事がうまくいかない可能性を認めることから始めましょう。

ユーザーは常に「あなたの想像」を超えてくる

あなたが「数字を入れてください」と画面に表示したとき、すべてのユーザーが素直に数字を入れてくれるとは限りません。 全角の数字を入れる人もいれば、間違えて漢字を入力してしまう人も、あるいは何も入れずに決定ボタンを押す人もいます。

これを「ユーザーのミス」と切り捨ててしまうのは簡単ですが、それでは良いシステムとは言えません。 不測の事態に強いエンジニアは、あらかじめ「数字以外が入ってくる可能性」を織り込んでコードを設計します。

「多分大丈夫」が牙を向く瞬間

開発中に「このデータは必ず存在するはずだから、チェックしなくても大丈夫だろう」と妥協したことはありませんか? その妥協こそが、将来の大きなバグやシステムダウンを引き起こす火種になります。

コンピューターの世界において、「絶対」という言葉は非常に危ういものです。 どんなに信頼しているデータでも、疑いの目を持って接することが、堅牢なプログラムを作るための秘訣と言えます。

綺麗なコードって何?初心者から一歩抜け出す「リーダブルコード」の3つの基本

エンジニア歴10年の私が学んだ「最悪」を想定する技術

私がまだジュニアエンジニアだった頃、深夜にシステムが停止して呼び出されたことがあります。 原因は、外部サービスから取得するデータが、メンテナンスのために一時的に「空」になっていたことでした。

私の書いたコードは、データが「ある」ことを前提にしていたため、空のデータを処理しようとしてエラーを吐き、システム全体を巻き込んで停止してしまったのです。 その時、先輩エンジニアから「プログラムを書くときは、常に最悪のシナリオを頭の中で再生しろ」と教わりました。

1行のチェックが数時間の障害を防ぐ

その障害を直すために必要だったのは、データが空かどうかを確認する、たった1行の if 文でした。 しかし、その1行がなかったために、多くのお客様に迷惑をかけ、私自身の睡眠時間も削られることになったのです。

この経験以来、私はコードを書く前に「ここが壊れたら、どこまで影響が及ぶか?」を自問自答するようになりました。 これが、不測の事態を予見する「エンジニアの嗅覚」の正体です。

想像力は技術力の一部である

優れたエンジニアは、単に文法に詳しいだけではありません。 彼らは、まだ起きていないトラブルを映像として思い浮かべる「想像力」が非常に長けています。

「ファイルが見つからなかったら?」 「パスワードが間違っていたら?」 「途中で電源が切れたら?」

こうした問いかけを自分に投げ続けることで、バグが生まれる隙間を一つずつ埋めていくのです。

Pythonで実践する「防御的」プログラミング

では、具体的にどのようにして例外を予見し、対処すれば良いのでしょうか。 Pythonには、こうした不測の事態をスマートに扱うための例外処理という仕組みが備わっています。

ここでは、初心者が明日から使える具体的なテクニックを、サンプルコードを交えて紹介します。 コードを守るための技術を、少しずつ自分のものにしていきましょう。

1. 入力値を疑う(バリデーション)

プログラムの入り口で、データが正しいかどうかを厳しくチェックすることをバリデーションと呼びます。 悪いデータが中に入り込む前に追い出すことで、後続の処理でエラーが起きるのを防ぐ手法です。

def calculate_age_in_10_years(age_str):
    # 数値に変換できるか事前にチェックする
    if not age_str.isdigit():
        return "エラー:数字を入力してください"

    age = int(age_str)
    return age + 10

# 正しい入力
print(calculate_age_in_10_years("25"))
# 不正な入力でも止まらない
print(calculate_age_in_10_years("二十五"))

このように、処理の最初でダメなものを弾いておくことで、プログラムが突然終了するのを防げます。 この考え方は、セキュリティを守る上でも非常に重要です。

2. 「やってみて、ダメなら対処する」の精神

Pythonでは、事前に細かくチェックするよりも、とりあえず実行してみてエラーが起きたら捕まえるという書き方が好まれます。 これを try-except 構文と呼び、予見しきれない例外に対処するための強力な武器になります。

def divide_numbers(a, b):
    try:
        result = a / b
        return f"結果は {result} です"
    except ZeroDivisionError:
        # 0で割ろうとした時の例外を予見して対処
        return "エラー:0で割ることはできません"
    except Exception as e:
        # 想定外のあらゆるエラーをキャッチして安全に終了
        return f"予期せぬエラーが発生しました: {e}"

print(divide_numbers(10, 0))

すべてのパターンを if 文で網羅するのは限界がありますが、この仕組みを使えば、万が一の事態でもシステムを優雅に(Gracefulに)着地させることができます。 エラーを「出す」のではなく「扱う」という意識への転換が大切です。

Pythonの例外処理のアンチパターン5選をご紹介!|初心者がやりがちな「べからず集」もぜひ参考にお読みください。

不測の事態を予見するための5つの思考スイッチ

例外を予見する力は、才能ではなく習慣によって磨かれます。 コードを書いているとき、あるいは設計を考えているときに、以下の5つのスイッチを自分の中で切り替えてみてください。

これらを意識するだけで、あなたのプログラミングの質は劇的に変化します。

最初は面倒に感じるかもしれませんが、慣れてくれば無意識にできるようになります。

スイッチ1:境界値を攻める

データが「0」のとき、あるいは「最大値」のとき、あなたのプログラムはどう動くでしょうか。 バグは、こうしたデータの境目に潜んでいることが非常に多いです。

「1文字も入力されなかったら?」「逆に100万文字入力されたら?」 極端なケースを想像することで、隠れた脆弱性を見つけ出すことができます。

スイッチ2:外部との接触を疑う

自分のコードの外側にあるもの、例えばファイル、データベース、APIなどは、すべて「いつか壊れるもの」と考えましょう。 これらは自分ではコントロールできない要因で、簡単に裏切ってきます。

外部からデータを取得する処理を書くときは、必ず「もし相手が返事をしなかったら?」というシナリオを用意しておきます。 通信タイムアウトの設定や、リトライ(再試行)の仕組みを考えるのもエンジニアの重要な仕事です。

スイッチ3:時間の経過を考慮する

今は正しく動いていても、1年後、10年後も同じように動くでしょうか。 日付の処理や、データの蓄積による速度低下など、時間は多くの例外を運んできます。

「2月29日(うるう年)に実行したら?」「データが1億件に増えたら?」 時間の流れを味方につけるために、未来の視点を持ってコードを見つめ直してみましょう。

スイッチ4:並列・並行の衝突を考える

複数の処理が同時に動く現代のシステムでは、データの奪い合いが発生することがあります。 「Aさんがデータを更新している最中に、Bさんが同じデータを削除したら?」といった状況です。

こうした複雑なタイミングの不一致(レースコンディション)を予見するのは難しいですが、意識するだけでも設計が変わります。 共有されるデータには、常に「鍵」をかけるような慎重さが必要です。

スイッチ5:悪意のある攻撃を想定する

世の中には、善意のユーザーばかりではありません。 あなたのプログラムの隙を突いて、不正な操作をしようとする人も存在します。

「ここからサーバーの中身を覗けないか?」「変なコマンドを実行させられないか?」 ハッカーのような視点を持つことで、例外処理は「防御壁」としての機能を持ち始めます。

例外予見トレーニング:よくあるシナリオと対策一覧

どのような場面でどんな例外が起きやすいのか、代表的なものを一覧表にまとめました。 開発中に迷ったときは、この表を確認して「対策が漏れていないか」をチェックしてみてください。

これらのパターンを覚えるだけでも、バグの発生率は大幅に下がります。 特に入力と通信に関しては、重点的にガードを固めるのがセオリーです。

シナリオ 発生しうる例外(一例) 予見して行うべき対策
ユーザー入力を受け取る ValueError, TypeError 型チェック、範囲チェック、デフォルト値の設定
ファイルを開く FileNotFoundError, PermissionError ファイルの存在確認、権限の確認、with 構文の使用
APIやDBに接続する ConnectionError, Timeout タイムアウト設定、リトライ処理、予備データの使用
リストや辞書を扱う IndexError, KeyError get() メソッドの使用、要素数の事前確認
計算を行う ZeroDivisionError, OverflowError 0除算チェック、数値の範囲バリデーション

この表にある対策を一つずつ実装していくことで、あなたのプログラムは鉄壁の守りを手に入れます。 すべてを完璧にする必要はありませんが、主要なリスクから順に潰していくのが賢いやり方です。

Pythonの哲学「EAFP」を知ると楽になる

例外処理を学ぶと、あちこちに if 文を書きすぎて、コードが読みづらくなってしまうことがあります。 そこで知っておきたいのが、Pythonの有名なプログラミング哲学である「EAFP」です。

EAFPは「許可を得るより、許しを請う方が簡単だ(Easier to Ask for Forgiveness than Permission)」の略です。 つまり、「事前に細かくチェックするより、まずやってみて、エラーが出たら謝る(対処する)」という考え方です。

LBYL(石橋を叩いて渡る)との違い

対照的な考え方に「LBYL(Look Before You Leap:跳ぶ前に見ろ)」があります。 これは、実行前に if 文ですべての条件を確認する、いわゆる「石橋を叩いて渡る」スタイルです。

どちらが良いかは状況によりますが、PythonではEAFPの方がコードがスッキリし、実行速度も速くなる傾向があります。 例外を恐れすぎて if 文の迷路に迷い込むのではなく、try-except を堂々と使いこなしましょう。

PythonのEAFP/LBYLとは?「許可より許しを求める」プログラミング哲学とは

適切な範囲で「捕まえる」コツ

例外処理を書くときにやってはいけないのが、何でもかんでも大きな try ブロックで囲ってしまうことです。 これでは、どこで何のエラーが起きたのかが分からなくなり、逆にバグを見逃す原因になります。

「例外が起きそうな場所」をピンポイントで囲み、特定の例外(ValueError など)だけを狙い撃ちして捕まえるのがプロの技です。 狙いを定めることで、エラーメッセージもより親切なものになり、ユーザーの助けになります。

まとめ:不測の事態に強いエンジニアは、世界に優しい

例外を予見する思考プロセスは、単にバグを減らすためのテクニックではありません。 それは、あなたのプログラムを使うユーザーが困らないように配慮する「優しさ」そのものです。

エラーで画面が真っ白になったとき、ユーザーは不安になり、自分を責めてしまうことさえあります。 そこで「数字を入力してくださいね」と優しいメッセージを返せるエンジニアは、技術だけでなく人間性でも評価されます。

プログラミングは、不完全な人間が作るものですから、バグをゼロにすることは不可能です。 しかし、不測の事態を予見し、それを丁寧に扱うことで、私たちは「信頼」を積み上げることができます。

今日からコードを書くとき、心の中でこう呟いてみてください。 「もし、ここで何かが起きたら?」

その問いかけが、あなたをより高いステージへと引き上げてくれるはずです。 失敗を恐れず、例外を友達にして、一歩ずつ進んでいきましょう。

Pythonの基礎から応用まで学べる
Python WebAcademy

Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。
また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

Pythonの学習を始める