SHOEISHA iD

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

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

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

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

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

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

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

 システムエラーへの対処は、正常系の流れとは違う例外的なケースなので、必然的に.NET Frameworkの例外処理を使うことになります。

.NET Frameworkの例外処理

 システムエラーが発生した際、何らかの「例外(Exception)」がスローされます。例外を処理するには、.NET Frameworkではtry-catch構文が一般的です。

 しかし、try-catch構文では各イベントハンドラーにそれぞれ記載する必要があり、冗長感は否めません。また、別々に処理を書くということは、例外を握りつぶしてしまうなど、バグが入り込む余地が残されており、アプリケーションで統一した挙動を保証できなくなってしまいます。

 この問題を解決するため、.NET Frameworkには「集約例外ハンドラー」という仕組みが用意されています。集約例外ハンドラーは今回の連載で扱っているASP.NETだけでなく、コンソールアプリケーション、Windowsフォームアプリケーション、WPFアプリケーション、Windowsサービスアプリケーションなど、あらゆるアプリケーションで使用できます。

 ただし、集約例外ハンドラーを利用する具体的な方法については統一されていませんので、実装するアプリケーションごとにやり方をMSDNライブラリなどで確認してください。

 今回はASP.NETで集約例外ハンドラーを利用するやり方について説明します。

集約例外ハンドラー

 ASP.NETの集約例外ハンドラーには、発生した例外を補足する箇所の違いで、アプリケーションレベル、ページレベルの2種類あります。

[1] アプリケーションレベルの集約例外ハンドラー

 アプリケーションレベルの集約例外ハンドラーは、「グローバル アプリケーション クラス(Global.asaxファイル)」を用いて、Application.Errorイベントハンドラーを実装します。

[リスト4]アプリケーションレベルの集約例外ハンドラーの実装(Global.asaxファイル)
void Application_Error(object sender, EventArgs e)
{
  var ex = Server.GetLastError(); // (1)
  Logger.WriteError(ex); // (2)
}
(1) 発生した例外を取得する

 発生した例外を取得するには、Server.GetLastError()メソッドを使用します。

(2) 発生した例外の情報を処理する

 イベントログやログファイルなどに発生した例外の内容を出力します。

 出力する情報に他に付加すべき内容があれば自由に追加してください。

 例外情報の出力で良くありがちなのが「発生した機能名も出力したい」といったケースです。これについては、.NET Frameworkの例外機構はスタックトレースという仕組みを持っていて、例外が発生した箇所の詳細が標準の仕組みで確認可能です。従って、各アプリケーションで独自に機能名を埋め込むなどの処理は不要です。

 基本的にはアプリケーションレベルで十分だとは思いますが、ページごとに何らかのクリーンアップ処理が必要であるなどの特殊な理由があれば、ページレベルの処理を行っても良いでしょう。

[2] ページレベルの集約例外ハンドラー

 ページレベルの集約例外ハンドラーは、Page.Errorイベントハンドラーです。発生した例外の取得方法などは、Application.Errorイベントハンドラーと同じです。

 なお、発生した例外はページレベルの集約例外ハンドラーで例外を処理した後も、そのままアプリケーションレベルの集約例外ハンドラーでも捕捉されますので注意が必要です。

次のページ
まとめ

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

実例で学ぶ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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー