在本文中我们将通过一个简单的处理来记录在我们的网站中的错误和异常我们会这样操作每当遇到程序错误时将使用者导航到一个单独的页面同时错误将被记录到服务器上的一个文本文件每当错误发生时我们将以日志的形式每天记录说了这么多让我们来看一些代码
步骤一首先创建一个错误文件夹用于存放错误日志文件鼠标右键站点 > 创建新文件夹将该文件夹命名为Error 如果站点中没有 nfig 文件时请添加一个 右键站点 > 添加新项目 > nfig
步骤二现在我们要创建一个错误处理的代码我们只需要右键站点 > 添加新项目 > 选择类 重命名该类为ErrHandlercs 然后单击 添加 按钮当你这么操作的时候会弹出一个对话框是否要将这个类文件保存在App_Code里面我们选择接受
步骤三现在我们为ErrHandlerclass添加一些功能该类用于接受错误信息并将错误信息保存在一个文本文件中每天创建一个这样的文本文件如果已经存在相同的文件名时错误信息将会追加到这个文件中否则就创建一个新文件并将错误信息写入该文件
代码看来如下 /// 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/ + DateTimeTodayToString(ddmmyy) + txt;
if (!FileExists(SystemWebHttpContextCurrentServerMapPath(path)))
{
FileCreate(SystemWebHttpContextCurrentServerMapPath(path))Close();
}
using (StreamWriter w = FileAppendText(SystemWebHttpContextCurrentServerMapPath(path)))
{
wWriteLine(\r\nLog Entry : );
wWriteLine({} DateTimeNowToString(CultureInfoInvariantCulture));
string err = Error in: + SystemWebHttpContextCurrentRequestUrlToString() +
Error Message: + errorMessage;
wWriteLine(err);
wWriteLine(__________________________);
wFlush();
wClose();
}
}
catch (Exception ex)
{
WriteError(exMessage);
}
}
这就是我们的ErrHandler类了然后我们来看看如何使用这个类和在Page级中(Application级中)处理错误
在Page级中处理错误
在Defaultaspx中从工具箱中添加一个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
ErrHandlerWriteError(exMessage);
}
}
现在
运行程序
并点击按钮
因为我们已经在代码中处理了错误和记录下了异常
你会发现当点击按钮时
似乎什么也没发生
关闭程序
刷新Error文件夹
你会看到有个以今天日期为文件名的新文件被创建
异常已经被成功记录下如下所示
其中日期和时间在您的机器上会有所不同
Log Entry :
// ::
Error in:x Error Message:Sample Exception
__________________________
Redirecting users on unhandled errors(在未有处理错误情况下重定向用户)
让我们看看如何在Application级上来捕捉未有错误处理而发生的错误并将用户定向到一个不同的页面
要捕捉到未有错误处理的错误只需做以下的工作即可添加一个 Globalasax 文件(右键工程项目 > Add New Item > Glabalasax)在当中的 Application_Error() 方法中增加以下代码 void Application_Error(object sender EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception objErr = ServerGetLastError()GetBaseException();
string err = Error in: + RequestUrlToString() +
Error Message: + objErrMessageToString();
// Log the error
ErrHandlerWriteError(err);
}
我们注意到通过使用 Server
GetLastError() 函数来捕捉错误
当一个未有错误处理的错误发生时
要将用户重定向到不同的页面
我们要做的是
打开你的 nfig 文件
并定位到 <customErrors> 标签处并注销它
在移除注释后
标签看来应该是这样的
<!
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=RemoteOnlydefaultRedirect=>
<errorstatusCode=redirect= />
<errorstatusCode=redirect= />
</customErrors>
将
mode=
RemoteOnly
tomode=
On
defaultRedirect= to defaultRedirect=ErrorPageaspx 修改为 <customErrorsmode=OndefaultRedirect=ErrorPageaspx>
<errorstatusCode=redirect= />
<errorstatusCode=redirect= />
</customErrors>
这个配置文件将会将用户导向名为ErrorPageaspx 的页面我们来创建这个错误页面并显示一些信息给用户
右键网站 > Add New Item > 创建 ErrorPageaspx 然后显示一个信息在页面中提示用户有个错误发生了
为了测试这个功能我们回到 Defaultaspx 添加新的按钮并命名为 btnUnhandled 并将文本属性设置为 Throw Unhandled Exception我们将使用Divide By Zero异常并不去处理它我们可以发现少了 catch 块所以当错误发生时用户就会按照我们在nfg文件中设置的重定向到 ErrorPageaspx protected void btnHandled_Click(object sender EventArgs e)
{
int i = ;
int j = ;
ResponeWrite( i / j );
}
运行这个程序点击
Throw Unhandled Exception
按钮
你会发现用户被自动地定向到了 Error 页面
并且错误也被记录在 Error 文件夹中