艾伟:【翻译】使用ASP.NET 2.0记录错误

简介: 原文:http://www.dotnetcurry.com/ShowArticle.aspx?ID=94&AspxAutoDetectCookieSupport=1使用ASP.NET 2.0记录错误  在我们开发和操作一个网站的过程中不可避免会发生错误和失败的情况.

原文:http://www.dotnetcurry.com/ShowArticle.aspx?ID=94&AspxAutoDetectCookieSupport=1

使用ASP.NET 2.0记录错误

  在我们开发和操作一个网站的过程中不可避免会发生错误和失败的情况. 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级中)处理错误.

在Page级中处理错误

  在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
__________________________

Redirecting users on unhandled errors(在未有处理错误情况下重定向用户)

  让我们看看如何在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 文件夹中.

目录
相关文章
|
Web App开发 前端开发 .NET
一起谈.NET技术,关于技术争论(尤其是ASP.NETWebForms 和 ASP.NETMVC 之争)
  技术争论在博客和twitter里无休止地进行着,这些争论涵盖每个开发人员社区。每个语言,框架,工具,和平台在某个特定的时间都不可避免地会至少有几个争论在进行中。   下面是我多年来对技术争论所做的几个总的观察,以及对一些我最近看到的,尤其是关于ASP.NET Web Forms 和 ASP.NET MVC的最新讨论的一些评论。
1603 1
|
XML 前端开发 .NET
一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路
  在BPM、OA等系统中,都会存在一个表单设计器。有些是通过操作gridview来完成一个表单的设计;有些是通过类似VS拖拽的方法完成一个表单的设计。很明显后面一种优越于前面一种。无论是哪种,最后都会产生一些XML之类的表单结构的数据。
1323 0
|
Web App开发 .NET 数据安全/隐私保护
一起谈.NET技术,ASP.NET身份验证机制membership入门——项目
  前面说了很多关于membership的内容,感觉内容有点凌乱,内容都是一个个知识点,下面我们通过一个小的项目,来把所有的相关内容串一下。   首先描述一下需求:   我们要做一个最简单的网站。有三类用户:匿名用户,员工,管理员,网站结构如下:        admin目录下的页面只允许admin角色的用户访问,employee目录下的页面只允许emp角色的用户访问。
1116 0
|
缓存 算法 .NET
一起谈.NET技术,ASP.NET缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman
  ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓存 ASP.NET 缓存全解析5:文件缓存依赖 ASP.NET 缓存全解析6:数据库缓存依赖 ASP.NET 缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman   Memcached — 分布式缓存系统    1.Memcached是什么?   Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
1203 0
|
.NET
一起谈.NET技术,在ASP.NET 2.0中数据绑定的实现方法
1、为什么ASP.NET 2.0中的数据绑定控件不需要写代码就能完成更新、删除、新建等数据操作?   ASP.NET 1.x时,DataGrid等控件使用DataBinder.Eval(Container.DataItem,"ColumnName")这样的表达式可以将数据源中的数据绑定到控件上,但并不能在更新数据时自动将控件中的新值取出,更新回数据库。
1143 0
|
关系型数据库 MySQL C#
一起谈.NET技术,经验之谈:MySQL与ASP.NET配合更强大
  由于富有竞争力的价格和易于使用,MySQL在市场占有率方面逐步提升。开放源代码社区为了扩展MySQL的使用范围,开发出了.Net框架(.NET Framework)中可以使用的数据库连接器。我们就来学习一下如何在.Net应用程序中使用MySQL。
1560 0
|
SQL Web App开发 存储
一起谈.NET技术,如何实现ASP.NET网站个性化?
  个性化是大多数Web应用程序的一个关键部分。TechRepublic和Amazon就是典型的例子,它们能够记住用户的某些特征。应用ASP.NET 1.x实现这一功能需要完成一些额外的工作,并要使用Session对象,而ASP.NET2.0版本简化了个性化过程。
1055 0
|
前端开发 .NET
一起谈.NET技术,利用ASP.NET MVC源代码调试你的应用程序
  之前写了一篇博客:利用.NET Framework4.0的源代码调试你的应用程序。那篇文章教你如何利用.NET Framework4.0的源代码帮助你调试应用程序,其实也就是进入.NET Framework4.0源代码进行单步调试。
1070 0
|
.NET
一起谈.NET技术,ASP.NET Routing对请求的处理方式
  原本这是《关于ASP.NET Routing的几点内容》一文中的一节,不过等写完这节之后发现这块内容已经比较完整了,而且它本身也是独立和最为常见的部分,因此我把它提取出来单独成文。至于那片文章的其他部分我会再修改一下,明天发布。
844 0
|
SQL 缓存 .NET
一起谈.NET技术,ASP.NET缓存初探 使用得当是关键
  缓存是在内存存储数据的一项技术,也是ASP.NET中提供的重要特性之一,对于程序员来讲,了解ASP.NET缓存的工作原理对于其设计程序是非常有用的。   ASP.NET需要被缓存的对象多种多样,包括从数据库中提取出来的数据,以及aspx页面生成的静态页,甚至是编译好的程序集。
1157 0