由于以前的项目没有重视错误返回,基本上所有的try catch块里面都没有抛出异常代码,也就是catch只是捕捉到错误而没有让这个错误返回到界面上,我现在的想法是建一个类,只要catch捕捉到了异常,就会把异常日志写到这个类里面(我想由程序自动处理,而不是再到每个catch里面去加代码,那工作量太大了),然后在界面层将这个类的异常显示出来
在全局文件 Global.asax 中做处理。截获出现异常时的事件,并自定义处理过程。
参考下面代码,增加一个日志的写入就ok了。
void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
HttpContext context = ((HttpApplication)sender).Context;
Exception ex = context.Server.GetLastError();
if (ex == null || !(ex is HttpException) || (ex as HttpException).GetHttpCode() == 404)
return;
StringBuilder sb = new StringBuilder();
try
{
sb.Append("Url : " + context.Request.Url);
sb.Append(Environment.NewLine);
sb.Append(" Raw Url :" + context.Request.RawUrl);
sb.Append(Environment.NewLine);
while (ex != null)
{
sb.Append("Message : " + ex.Message);
sb.Append(Environment.NewLine);
sb.Append("Source : " + ex.Source);
sb.Append(Environment.NewLine);
sb.Append("StackTrace : " + ex.StackTrace);
sb.Append(Environment.NewLine);
sb.Append("TagetSite : " + ex.TargetSite);
sb.Append(Environment.NewLine);
ex = ex.InnerException;
}
}
catch (Exception ex2)
{
sb.Append("Error logging error : " + ex2.Message);
}
if (OASettings.Instance.EnableErrorLogging)
Utils.Log(sb.ToString());
context.Items["LastErrorDetails"] = sb.ToString();
context.Response.StatusCode = 500;
Server.ClearError();
context.Server.Transfer("~/error.aspx");
}
楼上正解!
在配置文件中,或者一楼的做法,是在出现异常的时候,做个总操作到指定页面。但是如果你系统中已经在出异常的地方加上catch了,那就不会发生上面的操作。所以还是重构一次,自己做个异常日志记录类,在catch里调用异常处理函数。
另外再按照第一步,处理些没有发现的异常。