ASP.NET未处理异常的处理

ASP.NET页面出现未处理异常时,其页面信息用户很难理解,我们的要求是:
(1)记录错误信息;
(2)对用户隐藏错误,只告知用户出错了。

1.在页面上处理(推荐)
创建一个类,其它页面从该类继承
public class WebPage :  System.Web.UI.Page
{
//添加事件处理方法
private void MyPage_Error(object sender, EventArgs e)
{
 //DoSomething();
}
//登记Error事件
private void InitializeComponent()
{    
 this.Error += new EventHandler(MyPage_Error);
}
}

2.在应用程序级处理(Global.sxsx.cs)
protected void Application_Error(Object sender, EventArgs e)
{
 //DoSomething(); 
}

3.修改Web.Config文件
<customErrors 
mode="RemoteOnly"
defaultRedirect="myerror.aspx"
>

4.调用顺序
调用顺序依次为:页面级->应用程序级->配置文件
如果在上一级代码中有页面重定向,则后面级别的程序就不会执行。

5.DoSomething();
主要做两件事:(1)记录出错信息。(2)重定向页面。
private void DoSomething()
{
 string ErrorID = DateTime.Now.ToString();
 string ErrStr = "ErrorID:" + ErrorID;
 ErrStr += "\r\n";
 ErrStr += Server.GetLastError().ToString();
 ErrStr += "\r\n";
 WriteLog(ErrStr);   
 Server.ClearError();
 string url = "/MyProject/FrmError.aspx?Message=发生未处理异常,请与系统管理员联系。";
 Response.Redirect(url);
}

6.WriteLog();
private void WriteLog(string info)
{
 string FileName = Server.MapPath("/MyProject/LogFiles/Error.LOG");
 using (StreamWriter sw = new StreamWriter(FileName,true))
 {  
  sw.WriteLine(info);
 }
}

7.Response.Redirect 还是 Server.Transfer
(1)Server.Transfer:在服务器端把处理的控制权从一个页面转移到另一个页面,在转移的过程中,不会丢失用户提交信息,而且浏览器的 URL 不变。
(2)Response.Redirect: 发送一个 HTTP 响应到客户端,告诉客户端跳转到一个新的页面,客户端再发送跳转请求到服务器。
(3)Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活;

8.Session失效的问题
Session失效的异常用户可以自己恢复,所以应单独处理。
protected void CheckUserInfo()
{
 if (Session["UserInfo"] != null)
 {
  m_cUser = (CAppUser)Session["UserInfo"];
 }
 else
 {   
  Response.Redirect("/MyProject/frmError.aspx?Message=当前页面已过期,请重新登陆!");
 }
}

 

posted @ 2006-12-01 15:04  seabluescn  阅读(708)  评论(1编辑  收藏  举报