ASP.NET WebFormsのエラー処理を完全解説!初心者でも安心の例外ハンドリング
生徒
「プログラムを作っていて、変な操作をしたら急に画面が英語だらけの怖い表示になりました!これって壊れちゃったんですか?」
先生
「それはプログラムが予測できない事態に驚いて止まってしまった状態ですね。これを『例外(れいがい)』と呼びます。」
生徒
「例外…。どうすればその怖い画面を出さずに、優しく案内できるようになりますか?」
先生
「『エラー処理』を学ぶことで、万が一の時も冷静にプログラムを動かし続けることができますよ。基本から丁寧に解説しますね!」
1. エラー処理と例外ハンドリングとは?
ASP.NET WebForms(エーエスピー・ドットネット・ウェブフォーム)を開発していると、必ず遭遇するのが「エラー」です。エラーには、文字の打ち間違いなどの単純なミスだけでなく、インターネットが急に切れたり、数字を入れるべき場所に文字が入力されたりといった、実行中に起こるトラブルがあります。
プログラミングの世界では、こうした予期せぬトラブルを例外(れいがい)と呼び、そのトラブルに対して「どう対処するか」を決めておくことを例外ハンドリング(エラー処理)と言います。
例えるなら、料理をしている時に「塩と砂糖を間違えた!」というトラブルが起きるようなものです。その場でパニックになって料理を投げ出すのではなく、「味を整える」か「作り直す案内をする」といった対策をあらかじめ考えておくのが、エラー処理の考え方です。
2. 最も基本の try-catch(トライ・キャッチ)構文
エラーに対処するための最も基本的な道具が try-catch 文です。これは、エラーが起きそうな場所をあらかじめ「囲っておく」仕組みです。パソコンに詳しくない方でも、「防護柵(ぼうごさく)」をイメージすると分かりやすいでしょう。
try ブロックの中に通常の処理を書き、もしそこでエラーが発生したら、即座に catch ブロックに処理がジャンプします。これにより、アプリが完全に止まってしまうのを防ぐことができます。
try
{
// ここにエラーが起きそうな処理を書く
int a = 10;
int b = 0;
int result = a / b; // 0で割るとエラーが発生します
}
catch (Exception ex)
{
// エラーが起きた時に実行される場所
lblMessage.Text = "計算中にエラーが発生しました。入力を確認してください。";
}
3. 最後に必ず実行する finally(ファイナリー)
エラーが起きても起きなくても、最後に絶対やっておきたい作業があるときに使うのが finally ブロックです。例えば、データの保存作業をしていた場合、成功しても失敗しても、開いたファイルの蓋を閉じる作業は必要ですよね。
「終わり良ければすべて良し」という言葉がありますが、プログラミングにおいては「最後のお片付け」をしっかり行うことで、次にプログラムが動く時に不具合を残さないようにします。try、catch、finally は三点セットで覚えると非常に強力な武器になります。
try
{
lblStatus.Text = "処理を開始します...";
// 何らかの重い処理
}
catch (Exception)
{
lblStatus.Text = "問題が発生しました。";
}
finally
{
// 成功・失敗に関わらず、最後のリセット処理
btnSubmit.Enabled = true;
}
4. ページ全体でエラーを見守る Page_Error イベント
個別の場所に try-catch を書くのは大切ですが、全ての場所に書くのは大変です。そこで WebForms には、ページ内で起きた未処理のエラーを一括で捕まえる Page_Error という仕組みがあります。
これは、ページという広い範囲を見守る警備員さんのようなものです。もし個別の対策をすり抜けたエラーがあっても、この警備員が最後にキャッチしてくれます。ここでエラーの内容を記録(ログ出力)したり、専用の案内ページへ案内したりすることができます。
protected void Page_Error(object sender, EventArgs e)
{
// ページ内で発生した最後の未処理エラーを取得
Exception exc = Server.GetLastError();
// エラーを記録したり、ユーザーに通知したりする
Response.Write("大変申し訳ございません。ページ内でエラーが発生しました。");
// エラーを処理済みにして、怖い画面を出さないようにする
Server.ClearError();
}
5. Web.config で「優しいエラー画面」を設定する
開発者にとっては、エラーの原因が詳しく書かれた英語の画面は便利ですが、一般のユーザーが見ると「ウイルスかな?」と不安にさせてしまいます。そこで、アプリ全体の設定ファイルである Web.config を使って、エラー時に自動的に表示する「専用の案内ページ」を指定することができます。
これを Custom Errors(カスタムエラー) 設定と呼びます。「お探しのページは見つかりませんでした」や「ただいまメンテナンス中です」といった日本語の優しい画面を表示させることで、ウェブサイトの信頼性を守ることができます。設定一つで、全てのページにこのルールを適用できるのが WebForms の便利な点です。
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="ErrorPage.aspx">
<error statusCode="404" redirect="NotFound.aspx" />
</customErrors>
</system.web>
</configuration>
6. 特定のエラーを狙い撃ち!例外の種類
例外にはいろいろな種類があります。例えば、インターネットの接続ミスは「通信の例外」、数字の計算間違いは「計算の例外」といった具合です。これらを細かく見分けることで、より親切なエラーメッセージを出すことができます。
お医者さんが「お腹が痛い」という患者さんに対して、原因が「食べ過ぎ」か「風邪」かで処方箋を変えるのと同じです。catch (DivideByZeroException) のように書くと、0で割り算した時専用の対策を書くことができます。最初は Exception という「全部まとめた」ものだけでも十分ですが、少しずつ種類を覚えていくと、より賢いプログラムになります。
7. 入力チェック(バリデーション)でエラーを未然に防ぐ
究極のエラー処理は、「エラーが起きないようにすること」です。ユーザーがボタンを押す前に、入力された内容が正しいかをチェックする機能を「バリデーション」と呼びます。
ASP.NET WebForms には、このチェックを自動で行う専用の部品(RequiredFieldValidatorなど)が用意されています。これを使えば、「必須項目が空欄です」といった警告を出し、そもそもサーバーにデータを送らせない(=エラーが起きる状況を作らせない)ことができます。エラー処理と入力チェックを組み合わせることで、鉄壁のウェブアプリが完成します。
8. ログ出力で「未来のエラー」に備える
エラーが発生したとき、その場で対処するだけでなく「いつ、どんなエラーが起きたか」を記録に残しておくことが非常に重要です。これをログ出力(ロギング)と言います。
パソコンの「日記」のようなもので、後から開発者がその日記を見ることで、「あ、昨日この時間帯にエラーが集中していたんだな」と原因を探ることができます。WebForms の開発では、ファイルに書き出したり、データベースに保存したりする手法がよく使われます。ユーザーには優しい画面を見せつつ、裏側ではしっかり記録を取るのがプロのエンジニアの仕事です。