編寫一個記錄錯誤的類
在咱們開發和操做一個網站的過程當中不可避免會發生錯誤和失敗的狀況. ASP.NET 2.0 提供了跟蹤,instrumentation以及錯誤處理機制來檢測和修補程序中的問題.
在本文中,咱們將經過一個簡單的處理來記錄在咱們的網站中的錯誤和異常.咱們會這樣操做:每當遇到程序錯誤時,將使用者導航到一個單獨的頁面.同時,錯誤將被記錄到服務器上的一個文本文件.每當錯誤發生時,咱們將以日誌的形式天天記錄.說了這麼多,讓咱們來看一些代碼.
步驟一:首先建立一個錯誤文件夾用於存放錯誤日誌文件.鼠標右鍵站點 > 建立新文件夾.將該文件夾命名爲"Error". 若是站點中沒有 Web.config 文件時,請添加一個. 右鍵站點 > 添加新項目 > Web.config.
步驟二:如今咱們要建立一個錯誤處理的代碼.咱們只須要右鍵站點 > 添加新項目 > 選擇類. 重命名該類爲"ErrHandler.cs" ,而後單擊 "添加" 按鈕.當你這麼操做的時候,會彈出一個對話框,是否要將這個類文件保存在"App_Code"裏面,咱們選擇接受.
步驟三:如今咱們爲ErrHandler.class添加一些功能.該類用於接受錯誤信息並將錯誤信息保存在一個文本文件中.天天建立一個這樣的文本文件.若是已經存在相同的文件名時,錯誤信息將會追加到這個文件中.不然,就建立一個新文件,並將錯誤信息寫入該文件.
代碼看來以下:
///
Handles error by accepting the error message
///
Displays the page on which the error occured
public
static
void
WriteError(
string
errorMessage)
{
try
{
string
path
=
"
~/Error/
"
+
DateTime.Today.ToString(
"
dd-mm-yy
"
)
+
"
.txt
"
;
if
(
!
File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
{
File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).
Close();
}
using
(StreamWriter w
=
File.AppendText(System.Web.HttpContext.Curre
nt.Server.MapPath(path)))
{
w.WriteLine(
"
\r\nLog Entry :
"
);
w.WriteLine(
"
{0}
"
, DateTime.Now.ToString(CultureInfo.InvariantCulture
));
string
err
=
"
Error in:
"
+
System.Web.HttpContext.Current.Request.Url.
ToString()
+
"
. Error Message:
"
+
errorMessage;
w.WriteLine(err);
w.WriteLine(
"
__________________________
"
);
w.Flush();
w.Close();
}
}
catch
(Exception ex)
{
WriteError(ex.Message);
}
}
這就是咱們的ErrHandler類了.而後咱們來看看如何使用這個類和在Page級中(Application級中)處理錯誤.
在Try ... Catch ... 塊中記錄錯誤
在Default.aspx中,從工具箱中添加一個button控件.將這個button命名爲 btnError 並設置值爲 "Throw Handled Exception".咱們將拋出一個異常.只要咱們定義了 catch 塊,當錯誤發生時,就會被捕捉到並登記在Error文件夾中.文本文件將以當天的日期做爲文件名,不存在文件時,一個新的文件將會被如下代碼所建立.
按鈕點擊操做代碼以下:
protected
void
btnHandled_Click(
object
sender, EventArgs e)
{
try
{
throw
new
Exception(
"
Sample Exception
"
);
}
catch
(Exception ex)
{
//
Log the error to a text file in the Error folder
ErrHandler.WriteError(ex.Message);
}
}
如今,運行程序,並點擊按鈕.由於咱們已經在代碼中處理了錯誤和記錄下了異常,你會發現當點擊按鈕時,彷佛什麼也沒發生.關閉程序,刷新Error文件夾,你會看到有個以今天日期爲文件名的新文件被建立.異常已經被成功記錄下以下所示.其中日期和時間在您的機器上會有所不一樣.
Log Entry :
01/11/2008 23:33:46
Error in: http://localhost:51087/ErrorHandling/Default.aspx. Error Message:Sample Exception
__________________________
未處理錯誤(Try ... Catch ... 以外),如何記錄?
讓咱們看看如何在Application級上來捕捉未有錯誤處理而發生的錯誤,並將用戶定向到一個不一樣的頁面.
要捕捉到未有錯誤處理的錯誤,只需作如下的工做便可.添加一個 Global.asax 文件(右鍵工程項目 > Add New Item > Glabal.asax).在當中的 Application_Error() 方法中,增長如下代碼:
void
Application_Error(
object
sender, EventArgs e)
{
//
Code that runs when an unhandled error occurs
Exception objErr
=
Server.GetLastError().GetBaseException();
string
err
=
"
Error in:
"
+
Request.Url.ToString()
+
"
. Error Message:
"
+
objErr.Message.ToString();
//
Log the error
ErrHandler.WriteError(err);
}
咱們注意到經過使用 Server.GetLastError() 函數來捕捉錯誤.當一個未有錯誤處理的錯誤發生時,要將用戶重定向到不一樣的頁面,咱們要作的是,打開你的 Web.config 文件,並定位到 標籤處並註銷它.在移除註釋後,標籤看來應該是這樣的:
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace. -->
<customErrorsmode="RemoteOnly"defaultRedirect="GenericErrorPage.htm">
<errorstatusCode="403"redirect="NoAccess.htm" />
<errorstatusCode="404"redirect="FileNotFound.htm" />
</customErrors>
將:
mode="RemoteOnly"tomode="On"
defaultRedirect="GenericErrorPage.htm" to defaultRedirect="ErrorPage.aspx"
修改成:
<customErrorsmode="On"defaultRedirect="ErrorPage.aspx">
<errorstatusCode="403"redirect="NoAccess.htm" />
<errorstatusCode="404"redirect="FileNotFound.htm" />
</customErrors>
這個配置文件將會將用戶導向 名爲ErrorPage.aspx 的頁面.咱們來建立這個錯誤頁面,並顯示一些信息給用戶.
右鍵網站 > Add New Item > 建立 ErrorPage.aspx ,而後顯示一個信息在頁面中,提示用戶有個錯誤發生了.
爲了測試這個功能,咱們回到 Default.aspx, 添加新的按鈕並命名爲 btnUnhandled 並將文本屬性設置爲 Throw Unhandled Exception.咱們將使用"Divide By Zero"異常.並不去處理它.咱們能夠發現少了 catch 塊.因此當錯誤發生時,用戶就會按照咱們在web.confg文件中設置的重定向到 "ErrorPage.aspx".
protected
void
btnHandled_Click(
object
sender, EventArgs e)
{
int
i
=
9
;
int
j
=
0
;
Respone.Write( i
/
j );
}
運行這個程序點擊 "Throw Unhandled Exception" 按鈕.你會發現用戶被自動地定向到了 Error 頁面.而且錯誤也被記錄在 Error 文件夾中.