您的位置:首页 > 其它

dever.cn中的异常处理

2004-06-22 23:21 375 查看
回想起靠关键字或错误代码定义异常的ASP时代,现在JAVA和.net中的异常处理机制实在是进步的太多了。

先定义一个异常源的struct
public struct ErrorItem
{
public string UserIp ;//用户IP
public string Page ;//错误发生的页面
public string Resource ;//错误源
public string ErrorInfo ;//错误信息
public DateTime ErrorTime ;//错误发生的时间
}
以下是一些我用到的主要异常处理方法:
public static void setError(Exception e)
{
System.Web.HttpContext hc = System.Web.HttpContext.Current;
// 将捕获的异常实例分解并处理
ErrorItem ei = new ErrorItem();
ei.ErrorInfo = e.Message;
ei.Resource = e.Source;
ei.Page = hc.Request.Path;
ei.UserIp = hc.Request.UserHostAddress.ToString();
ei.ErrorTime = DateTime.Now;

saveError(ei,true); //调用错误处理函数
}

public static void saveError(ErrorItem errItem,bool isView)
{
// 将错误信息写库供显示用
System.Web.HttpContext hc = System.Web.HttpContext.Current;
string strSql = "update error set ------------"
SqlHandle.ExecuteUpdateQuery(strSql)
ErrorHandle eh = new ErrorHandle()
// 判断日志文件是否存在,不存在则新建
eh.isExistLog()
// 将错误信息写入日志文件
XmlElement xErrorElement = xmlDoc.CreateElement("error") ;
eh.AddXmlAttribute(xErrorElement,"time",errItem.ErrorTime.ToString());
eh.AddXmlAttribute(xErrorElement,"resource",errItem.Resource);
eh.AddXmlAttribute(xErrorElement,"page",errItem.Page);
eh.AddXmlAttribute(xErrorElement,"ip",errItem.UserIp);
xErrorElement.InnerText = errItem.ErrorInfo ;
xmlRoot.AppendChild(xErrorElement) ;

if(isView)
{
hc.Response.Redirect( DeverClass.getRoot("ErrorHandle.aspx") );
}
}
// 用弹出窗口弹出错误信息并自动回退
public static void popError(string strError)
{
System.Web.HttpContext hc = System.Web.HttpContext.Current;
hc.Response.Write(" ");
???hc.Response.Write("alert('"+strError+"');");
???hc.Response.Write("history.go(-1);");
???hc.Response.Write(" ");
}
// 用弹出窗口弹出错误信息,第二个参数为返回页面
public static void popError(string strError,string strRePage)
{
System.Web.HttpContext hc = System.Web.HttpContext.Current;
hc.Response.Write(" ");
???hc.Response.Write("alert('"+strError+"');");
???hc.Response.Write("document.location='"+strRePage+"';");
???hc.Response.Write(" ");
}

setError方法处理的是程序中try{}中捕获的错误,将异常实例的信息分解后交给saveError来处理。saveError方法处理这些异常的同时也处理一些自定义的异常。参数isView控制是否要将错误显示给用户。
popError处理一些用户操作上的错误,比如说登陆时输入错误等,此类错误不影响程序运行,只要弹出个小窗口提示一下就OK。

异常处理一个很重要的环节是记录日志,将异常写到库里比较方便,但存在一个致命弱点,就是它会使数据库变的很大且难以控制,所以一般不推荐,我采用的方法是,将异常写到库里,注意是update而不是insert。这样库里永远就只有最新发生的一条异常。这条异常主要是显示给用户看的。异常写库的同时也将异常写到日志文件中,我写在一个XML文件中,查询历史记录时可直接显示XML文件中的内容。

在程序中捕获异常是控制程序正常运转的好办法,但并不能解决所有问题,因为我们不能把整个程序包在一个try块中,或者程序里到处是try块,这样都是低效的,明智的做法是预测可能发生的异常并捕获,对于一些预测不到的错误就交给系统来帮我们捕捉吧。
修改Global.asax.cs中的Application_Error方法,这个方法是在发生错误时系统自动调用的,当然对于try{}块中的错误它是不处理,因为它的错误处理优先级低于用户自定义异常处理。下面是我改写的该函数
protected void Application_Error(Object sender, EventArgs e)
{
if(System.Configuration.ConfigurationSettings.AppSettings["ErrorView"].Equals("ON"))
{
System.Web.HttpContext hc = System.Web.HttpContext.Current;
// 自定义错误信息
ErrorItem ei = new ErrorItem();
ei.ErrorInfo = "未捕获的错误";
ei.Resource = "未知";
ei.Page = hc.Request.Path;
ei.UserIp = hc.Request.UserHostAddress.ToString();
ei.ErrorTime = DateTime.Now;
ErrorHandle.saveError( ei,true ); //此处为出错处理
}
}

函数的处理根据你的需要来写。最好是在处理前加一个判断,因为有的时候我们并不希望它执行,比如说调试阶段。在web.config中加个开关值就OK了。

如果你觉得这样很麻烦,又或者你根本就不在意那些未捕获的异常,那好吧,有一些工作你还是应该做的。修改web.config文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: