はじめに
こんにちは!プログラミング歴3ヶ月、超駆け出しエンジニアのてっぺーです。
実は先日、初めての個人開発を終えドキドキしながらレビューをいただきました。先輩方から返ってきた言葉で、「エラーハンドリングがしっかりできている」という評価をたくさんいただいたんです。
でも正直に言います...
そのエラーハンドリング、AIに書いてもらいました!笑
「ここはどう書けばいいですか?」「こういう機能のアプリを作りたいです」とAIに尋ねたら、なんだか複雑で長いコードが出てきて、「まぁ動くからいいか!」とそのまま採用してしまった部分でした。おかげでレビューは良かったのですが、なぜ褒められたのか、そのコードが何をしているのか、全然分かっていない状態…これはまずい!
そこでこの記事では、「エラーハンドリング?なんそれ?」と私と同じように下記のような悩みを抱えている人を対象に、コードは極力使わず、「エラーハンドリング」の考え方を一緒に深掘りし、私の先輩方が褒めてくれた理由を理解することを目指します!
本記事の対象者
- プログラミングを始めたばかりで「エラーハンドリング」という言葉をなんとなく聞いたことがある人。
- AIにコードを書いてもらったら
try-catchのようなコードが入っていたけど、なぜ必要なのかがわからない人。 - エラーが出るとユーザーに不便な思いをさせるかもしれないと不安な人。
そもそも「エラーハンドリング」ってなんだ
プログラムにおける「エラー」と聞くと、多くの人は「自分の書いたコードのミス」だと思いがちです。しかし「エラーハンドリング」が扱うのは、あなたのせいではないプログラムの
外側で起こる「予期せぬ事態」
のことなんです。
エラーハンドリングとは、予期せぬ事態が起きても、プログラムがパニックになって「フリーズ」したり、「強制終了」したりしないように、あらかじめ適切な対応を準備しておくことです。
例えば!!
イメージしやすいようにレストランに例えて考えてみる...
| 項目 | プログラムの世界 | レストランの世界 |
|---|---|---|
| 処理 | ユーザーのデータを取得する | 注文を受ける |
| 予期せぬ事態(エラー) | インターネット接続が切れた | 注文した食材が売り切れた |
| エラーハンドリング | 接続エラー画面を表示する | 代替メニューを提案する |
もし、人気の料理が売り切れたとき、シェフ(プログラム)が「もうあかん!何もできひん!」と厨房でパニックになり店を閉めてしまったら(強制終了)お客様は困ってしまします。
エラーハンドリングがしっかりしているレストランは、売り切れという事態が発生しても、次のように対応します。
-
代替案の提示「お肉は売り切れですが、代わりに本日入荷の新鮮な魚料理がございますがいかがでしょうか?」
-
丁寧な説明と終了「申し訳ございません。本日はご提供できるものがございません。またのご来店をお待ちしております」
先輩方が褒めてくれた「エラーハンドリング」はAIが書いてくれたプログラムが、予期せぬ事態が起きた際にユーザーを思いやった丁寧な準備ができていたということだったのです!
「エラーハンドリング」の3つの考え方
エラーハンドリングのコードは、必ず次に説明する3つの基本動作の考え方で構成されています。コードの形ではなく、動作の意味に注目しましょう!
1.エラーが起きても捕まえる(Try-Catch)
これはプログラムが危ない橋を渡るときに、下にネットを張っておくという考え方です!どういうことかというと....
-
try(試みる) 「この処理は、成功するかもしれないけど、失敗するリスクもあるな」という危険な処理を囲みます。
-
catch(捕まえる) もしTryの中でエラーが発生したら、自動的に処理を中断し、このCatchブロックに飛び込んできます。そして、ここで「じゃあどうする?」という対処法(代替案の提示や謝罪など)を実行します。
| ネット(Catch)がない場合 | ネット(Catch)がある場合 |
|---|---|
| 橋から落ちたら… 地面に激突(強制終了)! |
橋から落ちても… ネットで受け止めて、ゆっくりと着地(代替処理)! |
2.エラーが起きたら「知らせて」止める
レストランの例で、「お肉が売り切れ」というエラーが発生したときを考えてみましょう。
- ウェイターさんがお客様の注文を受ける。
- シェフが在庫を確認し「お肉がない!」というエラーに遭遇。
このとき、シェフあは自分で勝手にお客様に謝るべきでしょうか?違いますよね。シェフがすべきことは、「お肉が売り切れだ!」という情報、その事実をウェイターさんに伝える、情報を「投げる」ことです。
プログラムの世界では、エラーが起きた場所(シェフ)がすべてを解決する必要はありません。エラーを「解決できる担当者(ウェイター)」まで、バトン形式で問題を引き渡す(投げる)。
結果、プログラムの適切な場所でエラーをまとめて処理できるようになり、コード全体がスッキリと整理されます。
3.エラーが起きても「必ず実行」する(Finally)
エラーハンドリングには後片付けも含まれます!
例: データベースへの接続や、ファイルを開く処理など。
たとえ処理の途中でエラーが発生し、プログラムがCatchにジャンプしたとしても、一度開いたデータベースやファイルは「必ず閉じて」解放しないと、他の処理の邪魔になってしまいます。なので「エラーが起ころうが、起こるまいが、とにかくこれは絶対に実行してね!」という処理を入れる場所が必要です!
- Finally エラーの有無にかかわらず、最後に実行される後片付けの場所。
レストランで言えば、お客様が注文を終えた後に、途中で気分が悪くなって帰ってしまっても、必ずテーブルの上の食器を片付け、拭き掃除をするのと同じです!
今日から意識するエラーハンドリング
コードは分からなくても、エラーハンドリングの設計は今日からできる!私は今後自分でコードを書くとき、あるいはAIが書いてくれたコードを見たときに、以下の視点で考えることにしました!
ユーザーへの「優しさ」をチェックする
プログラムが失敗したとき、ユーザー(お客様)は混乱しています。そのとき、プログラムはどんなメッセージを出すべきでしょうか?
❌ NGなメッセージ例: Error code: 404 / Connection timed out.
↓
ユーザー:「なんこれ?意味がわからん…」
✅ OKなメッセージ例: サーバーとの接続に失敗しました。インターネット接続を確認し、もう一度お試しください。
↓
ユーザー:「なるほど!ネット接続が原因か。再接続してみよ」
エラーハンドリングは誰が見るメッセージなのかを意識することが大切です!AIが生成したコードの中でユーザーに表示するメッセージの部分を見つけたら「もっと親切にできないか?」と考えてコードを書く意識が重要なのです!
まとめ:AIは先生。理解すれば最高の相棒
AIが書いてくれたコードは、プログラミングの世界で長年培われてきた「エラーハンドリングの教科書」のようなものです。私はその教科書のおかげで、スムーズに開発を進めることができました。
しかし真の力は、そのコードがなぜ必要なのかを理解し、次の開発で自分でその考え方を設計できるようになることです。
エラーハンドリングは、「もしものときのための、ユーザーへの優しさ」でした。私はこれから、恐れずにエラーと向き合い、親切なプログラムを作る設計思想を学んで行きます👍️