[ASP.NET] 追蹤與除錯 / Trace and Debug (二)
1.ASP.NET錯誤處理流程
當上線的網頁或是在開發中的網頁,執行到下段程式時,它出錯了。
protected void Page_Load(object sender, EventArgs e)
{
int i = 10;
int j = 0;
int k = i / j;
}
程式發生邏輯上的錯誤(任何錯誤都會出現類似下圖的畫面),如下圖(預設錯誤畫面)。但由此圖我們無法得知程式何處發生錯誤,此時就可以利用除錯(Debug)模式來得到更詳細的訊息。
3.網頁層級除錯。
3-1.開啟網頁的除錯,將Debug設為True會影響網頁效能,預設為False,在開發期間想透過它除錯時,才需要將它設為True。
<%@ Page Debug="true" %>
開啟除錯模式後,便可得到詳細的錯誤訊息(下圖為預設的錯誤頁面)。
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();
}
下圖為處理後的畫面
4.應用程式層級除錯。(套用到所有網頁,整個網站)
4-1.開啟應用程式級的除錯,該項設定與3-1相似,不同之處它的設定是套用到整個網站。
<system.web>
<compilation debug="true"/>
</compilation>
</system.web>
4-2.在專案中建立一個全域應用程式類別Global.asax,當網站發生任何錯誤時則會觸發Application_Error事件,一旦錯誤處理完畢必須要用Server.ClearError方法清除或是導向錯誤頁面;該項設定與3-2相似,不同之處它的設定是套用到整個網站。
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