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 使用 Common Language Runtime (CLR) ,以統一的方式通知應用程式錯誤。 發生錯誤時,會擲回例外狀況。 例外狀況是應用程式遇到的任何錯誤、條件或非預期行為。

在 .NET Framework 中,例外狀況是從 System.Exception 類別繼承的物件。 從發生問題的程式碼區域擲回例外狀況。 例外狀況會將呼叫堆疊傳遞至應用程式提供程式碼來處理例外狀況的位置。 如果應用程式未處理例外狀況,則瀏覽器會強制顯示錯誤詳細數據。

最佳做法是在程式代碼內區塊的程式代碼層級TryCatch//Finally處理 中的錯誤。 嘗試放置這些區塊,讓用戶可以在發生問題的內容中修正問題。 如果錯誤處理區塊與發生錯誤的位置太遠,則提供使用者修正問題所需的資訊會變得更困難。

Exception 類別

Exception 類別是例外狀況繼承的來源基類。 大部分的例外狀況物件都是 Exception 類別的某些衍生類別實例,例如 SystemException 類別、 IndexOutOfRangeException 類別或 ArgumentNullException 類別。 Exception 類別具有屬性,例如 StackTrace 屬性、 InnerException 屬性和 Message 屬性,可提供發生錯誤的特定資訊。

例外狀況繼承階層

運行時間有一組基底例外狀況,衍生自 SystemException 發生例外狀況時運行時間擲回的類別。 繼承自 Exception 類別的大部分類別,例如 IndexOutOfRangeException 類別和 ArgumentNullException 類別,不會實作其他成員。 因此,例外狀況的階層、例外狀況名稱和例外狀況中包含的資訊,都可以找到例外狀況的最重要資訊。

例外狀況處理階層

在 ASP.NET Web Forms 應用程式中,可以根據特定的處理階層來處理例外狀況。 您可以在下列層級處理例外狀況:

  • 應用程式層級
  • 分頁層級
  • 程式代碼層級

當應用程式處理例外狀況時,通常會擷取並顯示繼承自 Exception 類別之例外狀況的其他資訊給使用者。 除了應用程式、頁面和程式代碼層級之外,您也可以使用 IIS 自定義處理程式,在 HTTP 模組層級處理例外狀況。

應用層級錯誤處理

您可以修改應用程式的組態,或在應用程式的 Global.asax 檔案中新增Application_Error處理程式,來處理應用層級的預設錯誤。

您可以將 區 customErrors 段新增至 Web.config 檔案,以處理預設錯誤和 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>

不幸的是,當您使用組態將使用者重新導向至不同的頁面時,您沒有發生錯誤的詳細數據。

不過,您可以將程式代碼新增至 Application_ErrorGlobal.asax 檔案中的處理程式,以攔截應用程式中任何位置發生的錯誤。

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 網頁中 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();
}

處理錯誤之後,您必須呼叫 ClearError Server 物件的 方法, (類別) HttpServerUtility 加以清除,否則您會看到先前發生的錯誤。

程式代碼層級錯誤處理

try-catch 語句是由 try 區塊所組成,後面接著一或多個 catch 子句,指定不同例外狀況的處理程式。 擲回例外狀況時,Common Language Runtime (CLR) 會尋找處理此例外狀況的 catch 語句。 如果目前執行的方法未包含 catch 區塊,CLR 會查看呼叫目前方法的方法,依此類傳呼叫堆棧。 如果找不到 catch 區塊,CLR 就會向用戶顯示未處理的例外狀況訊息,並停止執行程式。

下列程式代碼範例示範使用 trycatch//finally 來處理錯誤的常見方式。

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 範例應用程式之前,您會將類別新增 ExceptionUtilityLogic 資料夾,以新增錯誤記錄支援。 如此一來,每次應用程式處理錯誤時,錯誤詳細數據都會新增至錯誤記錄檔。

  1. 以滑鼠右鍵按兩下 [邏輯] 資料夾,然後選取 [新增 ->新增專案]。
    [ 加入新項目 ] 對話方塊隨即出現。

  2. 選取左側的 Visual C# ->Code 範本群組。 然後,從中間清單中選取 [類別],並將它命名為 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 方法,將例外狀況寫入例外狀況記錄檔。 這個方法會採用兩個參數:例外狀況物件,以及包含例外狀況來源詳細數據的字串。 例外狀況記錄檔會寫入App_Data資料夾中的ErrorLog.txt 檔案。

新增錯誤頁面

在 Wingtip Toys 範例應用程式中,一個頁面將用來顯示錯誤。 錯誤頁面的設計目的是要向用戶顯示安全錯誤訊息。 不過,如果使用者是開發人員提出 HTTP 要求,要求是在程式碼所在的電腦上本機提供服務,則會在錯誤頁面上顯示其他錯誤詳細數據。

  1. 方案總管 中以滑鼠右鍵按兩下專案名稱 (Wingtip Toys) ,然後選取 [新增專案>]。
    [ 加入新項目 ] 對話方塊隨即出現。

  2. 選取左側的 Visual C# ->Web 樣本群組。 從中間清單中,選取 [主版頁面] 的 [Web 窗體],並將它命名為 ErrorPage.aspx

  3. 按一下 [新增]。

  4. 選取 Site.Master 檔案作為主版頁面,然後選擇 [ 確定]。

  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 ,判斷第一次處理錯誤的位置。 然後,最後發生的錯誤是由呼叫 GetLastError Server 物件的 方法所決定。 如果例外狀況已不存在,則會建立泛型例外狀況。 然後,如果在本機提出 HTTP 要求,則會顯示所有錯誤詳細數據。 在此情況下,只有執行 Web 應用程式的本機電腦才會看到這些錯誤詳細數據。 顯示錯誤資訊之後,錯誤就會新增至記錄檔,並從伺服器清除錯誤。

顯示應用程式的未處理錯誤訊息

藉由將區 customErrors 段新增至 Web.config 檔案,您可以快速處理整個應用程式發生的簡單錯誤。 您也可以指定如何根據其狀態代碼值來處理錯誤,例如找不到 404 - 檔案。

更新組態

將區 customErrors 段新增至 Web.config 檔案,以更新組態。

  1. 方案總管 中,尋找並開啟 Wingtip Toys 範例應用程式根目錄中的 Web.config 檔案。

  2. 將 區customErrors段新增至節點內的 <system.web>Web.config 檔案,如下所示:

    <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 段會指定設定為 「On」 的模式。 它也會指定 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。

    注意

    您必須按 CTRL+F5 來顯示頁面,而不會中斷程式代碼,才能在 Visual Studio 中檢視錯誤的來源。

  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 會呼叫 處理程式。 在此處理程式中,會擷取並檢閱最後一個例外狀況。 如果未處理例外狀況,但例外狀況包含內部例外狀況詳細數據 (即 InnerException 不是 null) ,應用程式會將執行傳送至顯示例外狀況詳細數據的錯誤頁面。

執行應用程式

您可以執行應用程式,以查看在應用層級處理例外狀況所提供的其他錯誤詳細數據。

  1. CTRL+F5 執行 Wingtip Toys 範例應用程式。
    應用程式會擲回 InvalidOperationException

  2. 檢閱瀏覽器中顯示的 ErrorPage.aspx

    ASP.NET 錯誤處理 - 應用層級錯誤

新增 Page-Level 錯誤處理

您可以使用將屬性新增 ErrorPage 至頁面的 指示詞,或將事件處理程式新增至 @Page 頁面的程式代碼後置,將頁面層級錯誤處理新增 Page_Error 至頁面。 在本節中,您將新增 Page_Error 事件處理程式,以將執行傳送至 ErrorPage.aspx 頁面。

  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 方法會接受兩個參數。 第一個參數是例外狀況物件。 第二個參數是用來辨識錯誤來源的字串。

檢查錯誤記錄資訊

如先前所述,您可以使用錯誤記錄檔來判斷應用程式應該先修正哪些錯誤。 當然,只會記錄已截獲並寫入錯誤記錄檔的錯誤。

  1. 方案總管 中,尋找並開啟 App_Data資料夾中的ErrorLog.txt 檔案。
    您可能需要從 方案總管 頂端選取 [顯示所有檔案] 選項或 [重新整理] 選項,以查看 ErrorLog.txt 檔案。

  2. 檢閱 Visual Studio 中顯示的錯誤記錄:

    ASP.NET 錯誤處理 - ErrorLog.txt

安全錯誤訊息

請務必注意,當應用程式顯示錯誤訊息時,不應該提供惡意使用者可能發現攻擊應用程式有幫助的資訊。 例如,如果您的應用程式未成功嘗試寫入資料庫,則不應該顯示包含正在使用之使用者名稱的錯誤訊息。 基於這個理由,紅色的一般錯誤訊息會顯示給使用者。 所有其他錯誤詳細數據只會顯示在本機計算機上的開發人員。

使用 ELMAH

ELMAH (錯誤記錄模組和處理程式) 是一種錯誤記錄功能,可讓您以 NuGet 套件的形式插入 ASP.NET 應用程式。 ELMAH 提供下列功能:

  • 記錄未處理的例外狀況。
  • 用來檢視重新編碼未處理之例外狀況之整個記錄的網頁。
  • 用來檢視每個已記錄例外狀況完整詳細數據的網頁。
  • 發生時每個錯誤的電子郵件通知。
  • 記錄中最後 15 個錯誤的 RSS 摘要。

您必須先安裝 ELMAH,才能使用 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 選取專案,然後按兩下 [ 確定]。

    ASP.NET 錯誤處理 - 選取項目對話方塊

  6. 如有需要,請按兩下 [管理 NuGet 套件] 對話框中的 [關閉]。

  7. 如果 Visual Studio 要求重載任何開啟的檔案,請選取 [全部是]。

  8. ELMAH 套件會在專案根目錄 的Web.config 檔案中新增本身的專案。 如果 Visual Studio 詢問您是否要重載修改 過的Web.config 檔案,請按兩下 [ ]。

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 錯誤記錄檔

摘要

在本教學課程中,您已瞭解如何在應用層級、頁面層級和程式代碼層級處理錯誤。 您也已瞭解如何記錄已處理和未處理的錯誤,以供稍後檢閱。 您已新增 ELMAH 公用程式,以使用 NuGet 將例外狀況記錄和通知提供給您的應用程式。 此外,您已瞭解安全錯誤訊息的重要性。

教學課程系列結論

感謝您追蹤。 希望這組教學課程可協助您更熟悉 ASP.NET Web Forms。 如果您需要 ASP.NET 4.5 和 Visual Studio 2013 中 Web Form 功能的詳細資訊,請參閱 ASP.NET 和 Web 工具 Visual Studio 2013 版本資訊。 此外,請務必查看後續 步驟 一節中所述的教學課程,並明確地試用 免費的 Azure 試用版

感謝 - Erik

後續步驟

深入瞭解如何將 Web 應用程式部署至 Microsoft Azure,請參閱使用成員資格、OAuth 和 SQL Database 部署安全 ASP.NET Web Forms 應用程式至 Azure 網站

免費試用

Microsoft Azure - 免費試用
將您的網站發佈至 Microsoft Azure 可節省您的時間、維護和費用。 這是將 Web 應用程式部署至 Azure 的快速程式。 當您需要維護和監視 Web 應用程式時,Azure 提供各種工具和服務。 管理 Azure 中的數據、流量、身分識別、備份、傳訊、媒體和效能。 此外,這全都以符合成本效益的方法提供。

其他資源

使用 ASP.NET 健全狀況監視記錄錯誤詳細數據
ELMAH

通知

我想要感謝下列對本教學課程系列內容做出重大貢獻的人員:

社群貢獻