ASP.NET エラー処理

作成者 : Erik Reitan

Wingtip Toys サンプル プロジェクトのダウンロード (C#) または 電子書籍のダウンロード (PDF)

このチュートリアル シリーズでは、ASP.NET 4.5 と Microsoft Visual Studio Express 2013 for Web を使用して ASP.NET Web Forms アプリケーションを構築する基本について説明します。 C# ソース コードを含むVisual Studio 2013 プロジェクトは、このチュートリアル シリーズに付属しています。

このチュートリアルでは、Wingtip Toys サンプル アプリケーションを変更して、エラー処理とエラー ログ記録を含めます。 エラー処理により、アプリケーションはエラーを適切に処理し、それに応じてエラー メッセージを表示できます。 エラー ログを使用すると、発生したエラーを見つけて修正できます。 このチュートリアルは、前のチュートリアル "URL ルーティング" に基づいており、Wingtip Toys チュートリアル シリーズの一部です。

ここでは、次の内容について学習します。

  • アプリケーションの構成にグローバル エラー処理を追加する方法。
  • アプリケーション、ページ、およびコード レベルでエラー処理を追加する方法。
  • 後で確認するためにエラーをログに記録する方法。
  • セキュリティを侵害しないエラー メッセージを表示する方法。
  • エラー ログ モジュールとハンドラー (ELMAH) エラー ログを実装する方法。

概要

ASP.NET アプリケーションは、実行中に発生したエラーを一貫した方法で処理できる必要があります。 ASP.NET は共通言語ランタイム (CLR) を使用します。これにより、アプリケーションに一様な方法でエラーを通知できます。 エラーが発生すると、例外がスローされます。 例外は、アプリケーションで発生したエラー、条件、または予期しない動作です。

.NET Framework では、例外は System.Exception クラスから継承されるオブジェクトです。 例外は問題が発生したコード領域からスローされます。 例外は、アプリケーションが例外を処理するコードを提供する場所に呼び出し履歴を渡します。 アプリケーションで例外が処理されない場合、ブラウザーは強制的にエラーの詳細を表示します。

ベスト プラクティスとして、コード内のブロック内のコード レベルで のTry//CatchFinallyエラーを処理します。 ユーザーが発生したコンテキストで問題を修正できるように、これらのブロックを配置してみてください。 エラー処理ブロックがエラーが発生した場所から離れすぎると、ユーザーに問題を解決するために必要な情報を提供することがより困難になります。

Exception クラス

Exception クラスは、例外が継承される基本クラスです。 ほとんどの例外オブジェクトは、Exception クラスの派生クラス (クラス、クラス、クラスなどSystemException) のIndexOutOfRangeExceptionArgumentNullExceptionインスタンスです。 Exception クラスには、発生したエラーに関する特定の StackTrace 情報を InnerException 提供するプロパティ (プロパティ、 Message プロパティ、プロパティなど) があります。

例外継承階層

ランタイムには、例外が発生したときにランタイムが SystemException スローする クラスから派生した例外の基本セットがあります。 Exception クラスを継承するほとんどのクラス (クラスや クラスなど IndexOutOfRangeException ) では、追加のメンバーは ArgumentNullException 実装されません。 したがって、例外の最も重要な情報は、例外の階層、例外名、および例外に含まれる情報にあります。

例外処理階層

ASP.NET Web Forms アプリケーションでは、特定の処理階層に基づいて例外を処理できます。 例外は、次のレベルで処理できます。

  • アプリケーション レベル
  • ページ レベル
  • コード レベル

アプリケーションが例外を処理する場合、Exception クラスから継承された例外に関する追加情報を取得してユーザーに表示することがよくあります。 アプリケーション、ページ、およびコード レベルに加えて、HTTP モジュール レベルおよび IIS カスタム ハンドラーを使用して例外を処理することもできます。

アプリケーション レベルのエラー処理

アプリケーションの構成を変更するか、アプリケーションの Global.asax ファイルにハンドラーをApplication_Error追加することで、アプリケーション レベルで既定のエラーを処理できます。

セクションをWeb.config ファイルに追加することで、既定のcustomErrorsエラーと HTTP エラーを処理できます。 セクション customErrors では、エラーが発生したときにユーザーがリダイレクトする既定のページを指定できます。 また、特定の状態コード エラーに対して個々のページを指定することもできます。

<configuration>
  <system.web>
    <customErrors mode="On" defaultRedirect="ErrorPage.aspx?handler=customErrors%20section%20-%20Web.config">
      <error statusCode="404" redirect="ErrorPage.aspx?msg=404&amp;handler=customErrors%20section%20-%20Web.config"/>
    </customErrors>
  </system.web>
</configuration>

残念ながら、構成を使用してユーザーを別のページにリダイレクトする場合、発生したエラーの詳細はありません。

ただし、Global.asax ファイル内のハンドラーにコードApplication_Errorを追加することで、アプリケーション内の任意の場所で発生するエラーをトラップできます。

void Application_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();

    if (exc is HttpUnhandledException)
    {
        // Pass the error on to the error page.
        Server.Transfer("ErrorPage.aspx?handler=Application_Error%20-%20Global.asax", true);
    }
}

ページ レベル エラー イベント処理

ページ レベルのハンドラーは、エラーが発生したページにユーザーを返しますが、コントロールのインスタンスは保持されないため、ページに何も表示されなくなります。 アプリケーションのユーザーにエラーの詳細を提供するには、具体的にエラーの詳細をページに書き込む必要があります。

通常は、ページ レベルのエラー ハンドラーを使用して、未処理のエラーをログに記録するか、役立つ情報を表示できるページにユーザーを移動します。

このコード例は、ASP.NET Web ページの Error イベントのハンドラーを示しています。 このハンドラーは、ページ内のブロック内で try/catch まだ処理されていないすべての例外をキャッチします。

private void Page_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();

    // Handle specific exception.
    if (exc is HttpUnhandledException)
    {
        ErrorMsgTextBox.Text = "An error occurred on this page. Please verify your " +                  
        "information to resolve the issue."
    }
    // Clear the error from the server.
    Server.ClearError();
}

エラーを処理した後、Server オブジェクト (HttpServerUtility クラス) のメソッドをClearError呼び出してクリアする必要があります。そうしないと、以前に発生したエラーが表示されます。

コード レベルのエラー処理

try-catch ステートメントは、try ブロックの後に 1 つ以上の catch 句が続き、異なる例外のハンドラーを指定します。 例外がスローされると、共通言語ランタイム (CLR) は、この例外を処理する catch ステートメントを検索します。 現在実行中のメソッドに catch ブロックが含まれていない場合、CLR は現在のメソッドを呼び出したメソッドを調び、呼び出し履歴を上に表示します。 catch ブロックが見つからない場合、CLR は未処理の例外メッセージをユーザーに表示し、プログラムの実行を停止します。

次のコード例は、 を使用してtry//catchfinallyエラーを処理する一般的な方法を示しています。

try
{
    file.ReadBlock(buffer, index, buffer.Length);
}
catch (FileNotFoundException e)
{
    Server.Transfer("NoFileErrorPage.aspx", true);
}
catch (System.IO.IOException e)
{
    Server.Transfer("IOErrorPage.aspx", true);
}

finally
{
    if (file != null)
    {
        file.Close();
    }
}

上記のコードでは、try ブロックには、考えられる例外から保護する必要があるコードが含まれています。 ブロックは、例外がスローされるか、ブロックが正常に完了するまで実行されます。 FileNotFoundException例外または例外が発生したIOException場合、実行は別のページに転送されます。 次に、エラーが発生したかどうかに関係なく、finally ブロックに含まれるコードが実行されます。

エラー ログのサポートの追加

Wingtip Toys サンプル アプリケーションにエラー処理を追加する前に、Logic フォルダーに クラスをExceptionUtility追加することでエラー ログのサポートを追加します。 これにより、アプリケーションがエラーを処理するたびに、エラーの詳細がエラー ログ ファイルに追加されます。

  1. [ロジック] フォルダーを右クリックし、[追加] ->[新しい項目] の順に選択します。
    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. 左側の [Visual C# ->Code templates] グループを選択します。 次に、中央の一覧から [クラス] を選択し、 ExceptionUtility.cs という名前を付けます

  3. [追加] をクリックします。 新しいクラス ファイルが表示されます。

  4. 既存のコードを次のコードに置き換えます。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.IO;
    
    namespace WingtipToys.Logic
    {
      // Create our own utility for exceptions
      public sealed class ExceptionUtility
      {
        // All methods are static, so this can be private
        private ExceptionUtility()
        { }
    
        // Log an Exception
        public static void LogException(Exception exc, string source)
        {
          // Include logic for logging exceptions
          // Get the absolute path to the log file
          string logFile = "~/App_Data/ErrorLog.txt";
          logFile = HttpContext.Current.Server.MapPath(logFile);
    
          // Open the log file for append and write the log
          StreamWriter sw = new StreamWriter(logFile, true);
          sw.WriteLine("********** {0} **********", DateTime.Now);
          if (exc.InnerException != null)
          {
            sw.Write("Inner Exception Type: ");
            sw.WriteLine(exc.InnerException.GetType().ToString());
            sw.Write("Inner Exception: ");
            sw.WriteLine(exc.InnerException.Message);
            sw.Write("Inner Source: ");
            sw.WriteLine(exc.InnerException.Source);
            if (exc.InnerException.StackTrace != null)
            {
              sw.WriteLine("Inner Stack Trace: ");
              sw.WriteLine(exc.InnerException.StackTrace);
            }
          }
          sw.Write("Exception Type: ");
          sw.WriteLine(exc.GetType().ToString());
          sw.WriteLine("Exception: " + exc.Message);
          sw.WriteLine("Source: " + source);
          sw.WriteLine("Stack Trace: ");
          if (exc.StackTrace != null)
          {
            sw.WriteLine(exc.StackTrace);
            sw.WriteLine();
          }
          sw.Close();
        }
      }
    }
    

例外が発生した場合は、 メソッドを呼び出して例外ログ ファイルに例外を LogException 書き込むことができます。 このメソッドは、例外オブジェクトと、例外のソースに関する詳細を含む文字列の 2 つのパラメーターを受け取ります。 例外ログは、App_Data フォルダー内の ErrorLog.txt ファイルに書き込まれます。

エラー ページの追加

Wingtip Toys サンプル アプリケーションでは、エラーを表示するために 1 つのページが使用されます。 エラー ページは、サイトのユーザーにセキュリティで保護されたエラー メッセージを表示するように設計されています。 ただし、ユーザーがコードが存在するコンピューターでローカルに提供されている HTTP 要求を行う開発者の場合は、エラー ページに追加のエラーの詳細が表示されます。

  1. ソリューション エクスプローラーでプロジェクト名 (Wingtip Toys) を右クリックし、[追加] ->[新しい項目] を選択します。
    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. 左側の [Visual C# ->Web テンプレート] グループを選択します。 中央の一覧から [ Web フォームとマスター ページ] を選択し、 ErrorPage.aspx という名前を付けます。

  3. [追加] をクリックします。

  4. マスター ページとして Site.Master ファイルを選択し、[ OK] を選択します

  5. 既存のマークアップを次のように置き換えます。

    <%@ Page Title="" Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.Master"  CodeBehind="ErrorPage.aspx.cs" Inherits="WingtipToys.ErrorPage" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <h2>Error:</h2>
        <p></p>
        <asp:Label ID="FriendlyErrorMsg" runat="server" Text="Label" Font-Size="Large" style="color: red"></asp:Label>
    
        <asp:Panel ID="DetailedErrorPanel" runat="server" Visible="false">
            <p>&nbsp;</p>
            <h4>Detailed Error:</h4>
            <p>
                <asp:Label ID="ErrorDetailedMsg" runat="server" Font-Size="Small" /><br />
            </p>
    
            <h4>Error Handler:</h4>
            <p>
                <asp:Label ID="ErrorHandler" runat="server" Font-Size="Small" /><br />
            </p>
    
            <h4>Detailed Error Message:</h4>
            <p>
                <asp:Label ID="InnerMessage" runat="server" Font-Size="Small" /><br />
            </p>
            <p>
                <asp:Label ID="InnerTrace" runat="server"  />
            </p>
        </asp:Panel>
    </asp:Content>
    
  6. 分離コード (ErrorPage.aspx.cs) の既存のコードを次のように置き換えます。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
      public partial class ErrorPage : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          // Create safe error messages.
          string generalErrorMsg = "A problem has occurred on this web site. Please try again. " +
              "If this error continues, please contact support.";
          string httpErrorMsg = "An HTTP error occurred. Page Not found. Please try again.";
          string unhandledErrorMsg = "The error was unhandled by application code.";
    
          // Display safe error message.
          FriendlyErrorMsg.Text = generalErrorMsg;
    
          // Determine where error was handled.
          string errorHandler = Request.QueryString["handler"];
          if (errorHandler == null)
          {
            errorHandler = "Error Page";
          }
    
          // Get the last error from the server.
          Exception ex = Server.GetLastError();
    
          // Get the error number passed as a querystring value.
          string errorMsg = Request.QueryString["msg"];
          if (errorMsg == "404")
          {
            ex = new HttpException(404, httpErrorMsg, ex);
            FriendlyErrorMsg.Text = ex.Message;
          }
    
          // If the exception no longer exists, create a generic exception.
          if (ex == null)
          {
            ex = new Exception(unhandledErrorMsg);
          }
    
          // Show error details to only you (developer). LOCAL ACCESS ONLY.
          if (Request.IsLocal)
          {
            // Detailed Error Message.
            ErrorDetailedMsg.Text = ex.Message;
    
            // Show where the error was handled.
            ErrorHandler.Text = errorHandler;
    
            // Show local access details.
            DetailedErrorPanel.Visible = true;
    
            if (ex.InnerException != null)
            {
              InnerMessage.Text = ex.GetType().ToString() + "<br/>" +
                  ex.InnerException.Message;
              InnerTrace.Text = ex.InnerException.StackTrace;
            }
            else
            {
              InnerMessage.Text = ex.GetType().ToString();
              if (ex.StackTrace != null)
              {
                InnerTrace.Text = ex.StackTrace.ToString().TrimStart();
              }
            }
          }
    
          // Log the exception.
          ExceptionUtility.LogException(ex, errorHandler);
    
          // Clear the error from the server.
          Server.ClearError();
        }
      }
    }
    

エラー ページが表示されると、 Page_Load イベント ハンドラーが実行されます。 ハンドラーでは Page_Load 、エラーが最初に処理された場所が決定されます。 次に、発生した最後のエラーは、Server オブジェクトの メソッドを GetLastError 呼び出すことによって決定されます。 例外が存在しなくなった場合は、汎用例外が作成されます。 その後、HTTP 要求がローカルで行われた場合は、すべてのエラーの詳細が表示されます。 この場合、Web アプリケーションを実行しているローカル コンピューターにのみ、これらのエラーの詳細が表示されます。 エラー情報が表示されると、エラーがログ ファイルに追加され、サーバーからエラーがクリアされます。

アプリケーションのハンドルされないエラー メッセージの表示

Web.config ファイルにセクションを追加customErrorsすることで、アプリケーション全体で発生する単純なエラーをすばやく処理できます。 404 - ファイルが見つからないなど、エラーの状態コード値に基づいてエラーを処理する方法を指定することもできます。

構成を更新する

セクションをWeb.config ファイルに追加customErrorsして、構成を更新します。

  1. ソリューション エクスプローラーで、Wingtip Toys サンプル アプリケーションのルートにある Web.config ファイルを見つけて開きます。

  2. 次のように、 customErrors ノード内の Web.config ファイルにセクションを <system.web> 追加します。

    <configuration>
      <system.web>
        <customErrors mode="On" defaultRedirect="ErrorPage.aspx?handler=customErrors%20section%20-%20Web.config">
          <error statusCode="404" redirect="ErrorPage.aspx?msg=404&amp;handler=customErrors%20section%20-%20Web.config"/>
        </customErrors>
      </system.web>
    </configuration>
    
  3. Web.config ファイルを保存します。

セクションでは customErrors 、"オン" に設定されているモードを指定します。 また、 を指定 defaultRedirectします。これにより、エラーが発生したときにどのページに移動するかをアプリケーションに指示します。 さらに、ページが見つからないときに 404 エラーを処理する方法を指定する特定のエラー要素を追加しました。 このチュートリアルの後半では、アプリケーション レベルでエラーの詳細をキャプチャするエラー処理を追加します。

アプリケーションの実行

これでアプリケーションを実行して、更新されたルートを確認できます。

  1. F5 キーを押して Wingtip Toys サンプル アプリケーションを実行します。
    ブラウザーが開き、 Default.aspx ページが表示されます。

  2. ブラウザーに次の URL を入力します (必ずポート番号 を使用してください )。
    https://localhost:44300/NoPage.aspx

  3. ブラウザーに表示される ErrorPage.aspx を確認します。

    ASP.NET エラー処理 - ページが見つかりませんエラー

存在しない NoPage.aspx ページを要求すると、エラー ページに単純なエラー メッセージと詳細なエラー情報が表示されます (詳細が利用可能な場合)。 ただし、ユーザーがリモートの場所から存在しないページを要求した場合、エラー ページにはエラー メッセージのみが赤で表示されます。

テスト目的の例外を含める

エラーが発生したときにアプリケーションがどのように機能するかを確認するには、ASP.NET で意図的にエラー条件を作成できます。 Wingtip Toys サンプル アプリケーションでは、既定のページが読み込まれたときにテスト例外がスローされ、何が起こるかを確認します。

  1. Visual Studio で Default.aspx ページの分離コードを開きます。
    Default.aspx.cs 分離コード ページが表示されます。

  2. ハンドラーで Page_Load 、ハンドラーが次のように表示されるようにコードを追加します。

    protected void Page_Load(object sender, EventArgs e)
    {
        throw new InvalidOperationException("An InvalidOperationException " +
        "occurred in the Page_Load handler on the Default.aspx page.");
    }
    

さまざまな種類の例外を作成できます。 上記のコードでは、Default.aspx ページが読み込まれるときに を作成InvalidOperationExceptionしています。

アプリケーションの実行

アプリケーションを実行して、アプリケーションが例外を処理する方法を確認できます。

  1. Ctrl + F5 キーを押して Wingtip Toys サンプル アプリケーションを実行します。
    アプリケーションは InvalidOperationException をスローします。

    Note

    Visual Studio でエラーの原因を表示するには、 Ctrl キーを押しながら F5 キー を押して、コードに分割せずにページを表示する必要があります。

  2. ブラウザーに表示される ErrorPage.aspx を確認します。

    ASP.NET エラー処理 - [エラー] ページ

エラーの詳細でわかるように、Web.configファイルの customError セクションによって例外がトラップされました。

Application-Level エラー処理の追加

例外に関する情報がほとんど得られていない Web.config ファイルの セクションを使用してcustomErrors例外をトラップするのではなく、アプリケーション レベルでエラーをトラップし、エラーの詳細を取得できます。

  1. ソリューション エクスプローラーで、Global.asax.cs ファイルを見つけて開きます。

  2. 次のように表示されるように 、Application_Error ハンドラーを追加します。

    void Application_Error(object sender, EventArgs e)
    {
      // Code that runs when an unhandled error occurs.
    
      // Get last error from the server
      Exception exc = Server.GetLastError();
    
      if (exc is HttpUnhandledException)
      {
        if (exc.InnerException != null)
        {
          exc = new Exception(exc.InnerException.Message);
          Server.Transfer("ErrorPage.aspx?handler=Application_Error%20-%20Global.asax",
              true);
        }
      }
    }
    

アプリケーションでエラーが発生すると、ハンドラーが Application_Error 呼び出されます。 このハンドラーでは、最後の例外が取得され、確認されます。 例外が未処理で、例外に内部例外の詳細 (つまり、null ではない) が含まれている場合、 InnerException アプリケーションは例外の詳細が表示されるエラー ページに実行を転送します。

アプリケーションの実行

アプリケーションを実行すると、アプリケーション レベルで例外を処理することによって提供される追加のエラーの詳細を確認できます。

  1. Ctrl + F5 キーを押して Wingtip Toys サンプル アプリケーションを実行します。
    アプリケーションは をスローします InvalidOperationException

  2. ブラウザーに表示される ErrorPage.aspx を確認します。

    ASP.NET エラー処理 - アプリケーション レベル エラー

Page-Level エラー処理の追加

ページレベルのエラー処理をページに追加するには、ページの ディレクティブに@Page属性をErrorPage追加するか、ページの分離コードにイベント ハンドラーを追加Page_Errorします。 このセクションでは、ErrorPage.aspx ページに実行を転送するイベント ハンドラーを追加Page_Errorします。

  1. ソリューション エクスプローラーで、Default.aspx.cs ファイルを見つけて開きます。

  2. 分離コードが Page_Error 次のように表示されるようにハンドラーを追加します。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WingtipToys
    {
      public partial class _Default : Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          throw new InvalidOperationException("An InvalidOperationException " +
          "occurred in the Page_Load handler on the Default.aspx page.");
        }
    
        private void Page_Error(object sender, EventArgs e)
        {
          // Get last error from the server.
          Exception exc = Server.GetLastError();
    
          // Handle specific exception.
          if (exc is InvalidOperationException)
          {
            // Pass the error on to the error page.
            Server.Transfer("ErrorPage.aspx?handler=Page_Error%20-%20Default.aspx",
                true);
          }
        }
      }
    }
    

ページでエラーが発生すると、 Page_Error イベント ハンドラーが呼び出されます。 このハンドラーでは、最後の例外が取得され、確認されます。 InvalidOperationExceptionが発生した場合、イベント ハンドラーはPage_Error、例外の詳細が表示されるエラー ページに実行を転送します。

アプリケーションの実行

これでアプリケーションを実行して、更新されたルートを確認できます。

  1. Ctrl + F5 キーを押して Wingtip Toys サンプル アプリケーションを実行します。
    アプリケーションは をスローします InvalidOperationException

  2. ブラウザーに表示される ErrorPage.aspx を確認します。

    ASP.NET エラー処理 - ページ レベル エラー

  3. ブラウザー ウィンドウを閉じます。

テストに使用される例外の削除

このチュートリアルで前に追加した例外をスローせずに Wingtip Toys サンプル アプリケーションを機能させるには、例外を削除します。

  1. Default.aspx ページの分離コードを開きます。

  2. ハンドラーで Page_Load 、例外をスローするコードを削除して、ハンドラーが次のように表示されるようにします。

    protected void Page_Load(object sender, EventArgs e)
    {
    
    }
    

Code-Level エラー ログの追加

このチュートリアルで既に説明したように、try/catch ステートメントを追加して、コードのセクションを実行し、発生した最初のエラーを処理できます。 この例では、エラーの詳細のみをエラー ログ ファイルに書き込み、後でエラーを確認できるようにします。

  1. ソリューション エクスプローラーLogic フォルダーで、PayPalFunctions.cs ファイルを見つけて開きます。

  2. コードが HttpCall 次のように表示されるように メソッドを更新します。

    public string HttpCall(string NvpRequest)
    {
      string url = pEndPointURL;
    
      string strPost = NvpRequest + "&" + buildCredentialsNVPString();
      strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode);
    
      HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
      objRequest.Timeout = Timeout;
      objRequest.Method = "POST";
      objRequest.ContentLength = strPost.Length;
    
      try
      {
        using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream()))
        {
          myWriter.Write(strPost);
        }
      }
      catch (Exception e)
      {
        // Log the exception.
        WingtipToys.Logic.ExceptionUtility.LogException(e, "HttpCall in PayPalFunction.cs");
      }
    
      //Retrieve the Response returned from the NVP API call to PayPal.
      HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
      string result;
      using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
      {
        result = sr.ReadToEnd();
      }
    
      return result;
    }
    

上記のコードは、 クラスに LogException 含まれているメソッドを ExceptionUtility 呼び出します。 このチュートリアルの前半で、 ExceptionUtility.cs クラス ファイルを Logic フォルダーに追加しました。 LogException は、次の 2 つのパラメーターを受け取ります。 最初のパラメーターは例外オブジェクトです。 2 番目のパラメーターは、エラーの原因を認識するために使用される文字列です。

エラー ログ情報の検査

前述のように、エラー ログを使用して、最初に修正する必要があるアプリケーション内のエラーを特定できます。 もちろん、トラップされ、エラー ログに書き込まれたエラーのみが記録されます。

  1. ソリューション エクスプローラーで、App_Data フォルダー内 のErrorLog.txt ファイルを見つけて開きます。
    ErrorLog.txtファイルを表示するには、ソリューション エクスプローラーの上部にある [すべてのファイルを表示] オプションまたは [更新] オプションを選択する必要がある場合があります。

  2. Visual Studio に表示されるエラー ログを確認します。

    ASP.NET エラー処理 - ErrorLog.txt

安全なエラー メッセージ

アプリケーションがエラー メッセージを表示するときに、悪意のあるユーザーがアプリケーションの攻撃に役立つと思われる情報を提供しないように 注意することが重要 です。 たとえば、アプリケーションがデータベースへの書き込みに失敗した場合、使用しているユーザー名を含むエラー メッセージは表示されません。 このため、赤色の一般的なエラー メッセージがユーザーに表示されます。 追加のエラーの詳細はすべて、ローカル コンピューターの開発者にのみ表示されます。

ELMAH の使用

ELMAH (エラー ログ モジュールとハンドラー) は、NuGet パッケージとして ASP.NET アプリケーションにプラグインするエラー ログ機能です。 ELMAH には、次の機能があります。

  • 未処理の例外のログ記録。
  • 再コーディングされた未処理の例外のログ全体を表示する Web ページ。
  • ログに記録された各例外の完全な詳細を表示する Web ページ。
  • 各エラーが発生した時点での電子メール通知。
  • ログからの過去 15 件のエラーの RSS フィード。

ELMAH を使用する前に、インストールする必要があります。 これは、NuGet パッケージ インストーラーを使用すると簡単です。 このチュートリアル シリーズで前述したように、NuGet は Visual Studio 拡張機能であり、Visual Studio でオープンソースライブラリとツールを簡単にインストールおよび更新できます。

  1. Visual Studio 内の [ツール] メニューから、[NuGet パッケージ マネージャー>] [ソリューションの NuGet パッケージの管理] の順に選択します。

    ASP.NET エラー処理 - ソリューションの NuGet パッケージを管理する

  2. [ NuGet パッケージの管理 ] ダイアログ ボックスが Visual Studio 内に表示されます。

  3. [ NuGet パッケージの管理 ] ダイアログ ボックスで、左側の [ オンライン ] を展開し、[ nuget.org] を選択します。次に、オンラインで使用可能なパッケージの一覧から ELMAH パッケージを見つけてインストールします。

    ASP.NET エラー処理 - ELMA NuGet パッケージ

  4. パッケージをダウンロードするには、インターネット接続が必要です。

  5. [ プロジェクトの選択 ] ダイアログ ボックスで、 WingtipToys の選択が選択されていることを確認し、[ OK] をクリックします。

    ASP.NET エラー処理 - [プロジェクトの選択] ダイアログ

  6. 必要に応じて、[NuGet パッケージの管理] ダイアログ ボックスの [閉じる] をクリックします。

  7. 開いているファイルを再度読み込むよう Visual Studio から要求された場合は、[すべて] に [はい] を選択します。

  8. ELMAH パッケージは、プロジェクトのルートにある Web.config ファイルにそれ自体のエントリを追加します。 変更したWeb.configファイルを再読み込みするかどうかを Visual Studio から確認するメッセージ 表示されたら、[ はい] をクリックします。

ELMAH は、発生した未処理のエラーを格納する準備ができました。

ELMAH ログの表示

ELMAH ログの表示は簡単ですが、まず、ELMAH ログに記録される未処理の例外を作成します。

  1. Ctrl + F5 キーを押して Wingtip Toys サンプル アプリケーションを実行します。

  2. ハンドルされない例外を ELMAH ログに書き込むには、ブラウザーで次の URL に移動します (ポート番号を使用)。
    https://localhost:44300/NoPage.aspx エラー ページが表示されます。

  3. ELMAH ログを表示するには、ブラウザーで次の URL に移動します (ポート番号を使用)。
    https://localhost:44300/elmah.axd

    ASP.NET エラー処理 - ELMAH エラー ログ

まとめ

このチュートリアルでは、アプリケーション レベル、ページ レベル、およびコード レベルでのエラーの処理について学習しました。 また、後で確認するために、処理されたエラーと未処理のエラーをログに記録する方法についても学習しました。 NuGet を使用してアプリケーションに例外ログと通知を提供する ELMAH ユーティリティを追加しました。 さらに、安全なエラー メッセージの重要性についても学習しました。

チュートリアル シリーズの結論

一緒にフォローしていただきありがとうございます。 私はあなたが ASP.NET Web Formsに慣れ親しむのに役立ったチュートリアルのこのセットを願っています。 ASP.NET 4.5 および Visual Studio 2013 で使用できるWeb Forms機能の詳細については、「Visual Studio 2013 リリース ノートの ASP.NET and Web Tools」を参照してください。 また、「 次の手順 」セクションで説明されているチュートリアルを確認し、 無料の Azure 試用版を定義して試してください。

ありがとう - Erik

次の手順

Microsoft Azure への Web アプリケーションのデプロイの詳細については、「メンバーシップ、OAuth、SQL Databaseを使用してセキュリティで保護された ASP.NET Web Forms アプリを Azure Web サイトにデプロイする」を参照してください。

無料試用版

Microsoft Azure - 無料試用版
Web サイトを Microsoft Azure に発行すると、時間、メンテナンス、経費が節約されます。 これは、Web アプリを Azure にデプロイするための簡単なプロセスです。 Web アプリを保守および監視する必要がある場合、Azure にはさまざまなツールとサービスが用意されています。 Azure でデータ、トラフィック、ID、バックアップ、メッセージング、メディア、パフォーマンスを管理します。 また、このすべてが非常にコスト効率の高いアプローチで提供されます。

その他のリソース

ASP.NET 正常性監視を使用したエラーの詳細のログ記録
Elmah

謝辞

私はこのチュートリアルシリーズの内容に大きなコントリビューションをした次の人々に感謝したいと思います:

コミュニティへの投稿