使用错误页统一处理错误

我们在做Asp.net应用程序的时候,通常在每个页面都要处理错误,这样一来即浪费了时间还不易于维护!在一个错误页中统一处理未知异常,是一个很好的办法!

    Asp.net 提供<customErrors>配置节提供了一个解决办法,使用方法如下:

<system.web>

      <customErrors defaultRedirect="~/ErrorPage.aspx"

                     mode="RemoteOnly">

      </customErrors>

</system.web>

defaultRedirect属性用来指明当aspx页面发生了未处理错误时导向的页面(由用户自己定义),Asp.net会在导向错误页时在错误页面的地址后面加上出现异常页面的地址。~/代表应用程序根目录,mode属性的用法请查msdn,不再赘述!这样我们就可以在ErrorPage页面中使用Server.GetLastError()方法来获得最近一次发生的异常了,然后进行写日志及提示用户等操作。

    想法虽好,实现起来有问题。为什么呢?因为Asp.net使用重定向机制来重新导航的错误页面,这样错误信息就会丢失,也就是说我们用Server.GetLastError()获得的Exception对象始终是空的。因此我们可以提示用户出错,并提供一个返回出错页面的链接,却不能给我们自己一个很好的答复。

    幸好天无绝人之路,我又找到了另一种方法,如果我们在第一时间得到页面出错信息,然后使用Server.Transer()方法导航到错误页,不就可以得到错误信息了吗!做法如下:

    在Global.asax文件中撰写如下代码:

    protected void Application_Error(Object sender, EventArgs e)
    {
       Server.Transfer("~/ErrorPage.aspx");
    }

这样我们在错误页中就可以做如下处理了:

//得到最新的异常信息,我们得到的异常类型为HttpUnhandledException,是真正错误的一个包装,

//至于Asp.net为什么这么做,我也不是很清楚

Exception exp = Server.GetLastError();

if(exp != null)

{
       this.lblErrorMessage.Text = "您查看的页面出错了,请与管理员联系";
 

       //内部异常中保存这本次错误的详细信息 


       if(exp.InnerException != null)
       {

            //写异常日志,自己定义的方法

            WriteExceptionLog(exp.InnerException);

       }

       //清除我们已经处理的异常,以免不小心重复处理。

       Server.ClearError();

}

好了,事情总算完成了,仔细一看,大跌眼镜,在两种方法下,比较出错页面的地址栏就知道为什么了。造成这个问题的原因在于Server.Transfer()与Response.Redirect()方法执行方式的不同。我也没招了,解决成这样差强人意,如果有更好的办法请你告诉我。

 现在已经找到了合适的处理方式了::

可以在Global.asax文件中写错误处理代码,可以避免以上问题:

    protected void Application_Error(Object sender, EventArgs e)
    {
       //Log.Write    ,write sth

    }


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gentle_wolf/archive/2008/11/27/3394418.aspx

你可能感兴趣的:(统一处理)