SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

エラー処理をパターンにはめよう

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第3回

突合せエラー

 突合せエラーの対処は、DBアクセスなどの外部プロセスを呼び出す処理が必要な関係上、第1回、第2回で説明した「ロジック層」で行うことになります。「プレゼンテーション層」であるaspxファイル、および分離コードファイルでは、ロジック層の実行結果を判定し、適切なエラーメッセージを表示することになります。

 ロジック層からプレゼンテーション層への処理結果を戻す方法には、メソッドの戻り値を使う方法と例外を使う方法の2種類があります。

 まず、メソッドの戻り値を使う方法ですが、第1回、第2回で紹介したデータバインドを活用したロジック層の呼び出しではなく、自前でロジック層の呼び出しを行う際に採用します。

 具体的なコード例を示します。

[リスト2]突合せエラーの実装方法(戻り値使用)(MeetingRoomsAdd.aspx.csより)
protected void InsertButton_Click(object sender, EventArgs e)
{
  // ... 省略 単体入力チェック後

  // 追加処理
  var logic = new MeetingRoomLogic();
  var result = logic.Insert(meetingRoom); // (1)

  // (2)
  switch (result)
  {
    case MeetingRoomLogic.InsertMeetingRoomResult.MeetingRoomNameDuplicated:
      // 同じ名前で登録済み
      PageUtilities.ShowErrorMessage(this, "既に同じ名前の会議室が登録されています。");
      return;
  }

  Response.Redirect("~/MeetingRooms.aspx");
}
(1) ロジック層の処理結果を受け取る

 ロジック層の実行結果を、ロジック層のクラスの内部に定義した列挙型として受け取ります。こうすることで、その列挙型が結びついているロジック層のクラスが明確になります。

(2) 処理結果を判定する

 戻り値を判定し正常終了でないときは、適切なメッセージを表示します(PageUtilities.ShowErrorMessageメソッドは、サンプルに独自に定義したメッセージ表示処理です)。

 また、メッセージを表示したらそこで処理を中断させます。

 次に例外を用いた方法は、データバインドを活用したロジック層の呼び出しを行う際に採用します。

 その理由は、データバインドを用いてロジック層を呼び出した際、戻り値を判定し、なおかつ入力値を保持することが困難なためです。

 具体的なコード例を示します。

[リスト3]突合せエラーの実装方法(例外使用)(MeetingRoomsDetail.aspx.csより)
protected void MeetingRoomsFormView_ItemUpdated(object sender, FormViewUpdatedEventArgs e)
{
  if (e.Exception != null)  // (1)
  {
    // (2)
    if (e.Exception.InnerException is MeetingRoomLogic.DuplicateMeetingRoomException)
    {
      // 同じ名前で登録済み
      PageUtilities.ShowErrorMessage(this, "既に同じ名前の会議室が登録されています。");

      // (3) 入力値を維持
      e.KeepInEditMode = true;
      
      // (4) 例外を処理済みとマーク
      e.ExceptionHandled = true;

      return;
    }
  }

  Response.Redirect("~/MeetingRooms.aspx");
}
(1) 例外の有無を判定する

 ロジック層の呼び出し時に例外が発生していた場合、FormViewコントロールのItemUpdatedイベントのイベント引数のExceptionプロパティが設定されています。

(2) 例外の種類を判定する

 発生した例外は、InnterExceptionプロパティに設定されていますので、その型を判定して適切なメッセージを表示します。

(3) 入力値を維持する

 メッセージを表示してもそのままだと入力した値が失われ、変更前の値が再表示されてしまいます。

 これを避けるため、KeepInEditModeプロパティにtrueを設定します。

(4) 例外を処理済みとマークする

 e.ExceptionHandledプロパティにtrueを設定することで、発生した例外を処理済みとマークします。これを行わないと、例外が未処理と判断されてしまうため、システムエラーとして扱われてしまいます。

 原則としてはメソッドの戻り値を使うようにし、データバインドにより業務ロジックを呼び出す必要があれば、例外を使用することを検討しましょう。

次のページ
システムエラーへの対処法

この記事は参考になりましたか?

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。< WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での 登録メンバ は約50名で、現在も執筆メンバを 募集中 。興味のある方は、どしどし応募頂きたい。 著書 記事 多数。 RSS X: @WingsPro_info (公式)、 @WingsPro_info/wings (メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6553 2012/05/16 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー