[ASP.NET] 追蹤與除錯 / Trace and Debug (二)

[ASP.NET] 追蹤與除錯 / Trace and Debug (二)

1.ASP.NET錯誤處理流程

1-1.當網頁錯誤發生時自訂錯誤頁面網頁層級錯誤處理(Page_Error) 應用程式錯誤處理(Application_Error) 預設錯誤畫面
1-2.若網頁沒有撰寫任何的錯誤處理,或是沒有回收清除(Server.ClearError),最後將顯示預設錯誤畫面;反之若有清除則不再往下一個除錯流程。

當上線的網頁或是在開發中的網頁,執行到下段程式時,它出錯了。

protected void Page_Load(object sender, EventArgs e)
{
    int i = 10;
    int j = 0;
    int k = i / j;
}
程式發生邏輯上的錯誤(任何錯誤都會出現類似下圖的畫面),如下圖(預設錯誤畫面)。但由此圖我們無法得知程式何處發生錯誤,此時就可以利用除錯(Debug)模式來得到更詳細的訊息。
快照-200942705421_thumb[5] 
2.ASP.NET追除錯可分為
2-1.網頁層級除錯。
2-2.
應用程式層級除錯。
2-3.自定除錯。

3.網頁層級除錯。

3-1.開啟網頁的除錯,將Debug設為True會影響網頁效能,預設為False,在開發期間想透過它除錯時,才需要將它設為True。

<%@ Page Debug="true" %>

開啟除錯模式後,便可得到詳細的錯誤訊息(下圖為預設的錯誤頁面)。

快照-20094271112_thumb[4]

3-2.要捕捉任何有單一網頁所丟擲出來的未處理錯誤例外訊息,可以透過Page_Error事件來定義事件,一旦錯誤處理完畢必須要用Server.ClearError方法清除錯誤訊息或是導向錯誤頁面;也就是說我們將不會看到上3-1所述的畫面。

protected void Page_Error(object sender, EventArgs e)
{
    // 1.擷取錯誤
    Exception ex = Server.GetLastError();
    // 2.根據發生的例外來解析錯誤網頁
    if (ex is NotImplementedException)
    {
        // 發生未處理錯誤時執行的程式碼
        // 1.擷取錯誤
        Exception ex = Server.GetLastError();
        // 2.根據發生的例外來解析錯誤網頁
        if (ex is NotImplementedException)
            Response.Write("Nothing");
        else
            // 3.顯示錯誤訊息,或將其重新導向適合的網頁
            //Server.Transfer("~/ErrorPage.aspx");
            Response.Write(ex.Message);
            Response.Write("應用程式等級除錯");
        // 4.清除錯誤
        Server.ClearError();
    }
        Response.Write("Nothing");
    else
        // 3.顯示錯誤訊息,或將其重新導向適合的網頁
        //Server.Transfer("~/ErrorPage.aspx");
        Response.Write(ex.Message);
        // 4.清除錯誤
        Server.ClearError();
}
下圖為處理後的畫面
快照-200942712144_thumb[4] 

4.應用程式層級除錯。(套用到所有網頁,整個網站)

4-1.開啟應用程式級的除錯,該項設定與3-1相似,不同之處它的設定是套用到整個網站。

<system.web>
    <compilation debug="true"/> 
    </compilation> 
</system.web> 

4-2.在專案中建立一個全域應用程式類別Global.asax,當網站發生任何錯誤時則會觸發Application_Error事件,一旦錯誤處理完畢必須要用Server.ClearError方法清除或是導向錯誤頁面;該項設定與3-2相似,不同之處它的設定是套用到整個網站。

20094265923_thumb4[1]

5.自訂錯誤畫面,自訂頁面可以讓我們的除錯流程更加客制化。

5-1.單一網頁設定,設定ErrorPage導向錯誤頁面。
<%@ Page Language="C#" ErrorPage="~/ErrorPage.htm"%>

在web.config

<customErrors mode="On"/>

5-2.應用程式層級(套用至整個網站)

5-2-1.主要customErrors標籤設定如下:

mode 顯示錯誤訊息模式。
on:在本機或遠端,將會展現自訂錯誤處理頁面,或是預設錯誤頁面。
off:在本機或遠端,將會展現詳細錯誤說明頁面。
RemoteOnly:在本機,將會展現詳細錯誤說明頁面;在遠端,將會展現自訂錯誤處理頁面,或是預設錯誤頁面。
defaultRedirect 預設連結頁面

<customErrors mode="On" defaultRedirect="~/ErrorPage.htm"/>

5-2-2.通用Http錯誤處理,在error標籤設定,依不同的錯誤碼,來轉向特定的錯誤頁面

statusCode 指定會導致重新導向錯誤網頁的 HTTP 狀態碼。
redirect 對應至錯誤碼的自訂網頁 URL。

設定statusCode與redirect對應連結

<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
  <error statusCode="403" redirect="NoAccess.htm" />
  <error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>

 

範例是演練上述錯誤處理展現,程式已經寫好,若要展現上述效果,可以自行解開註解、比對結果。

範例下載:ASP_C_Debug.rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo