日期:2014-05-18  浏览次数:20409 次

实现项目中出现异常,将异常信息写入文本文件中的功能.在测试的时候,为什么总是引发两次异常,内有代码~
Global.asax文件的关键代码:
void Application_Error(object sender, EventArgs e) 
{
  Exception x = Server.GetLastError().GetBaseException();
  Logger logger = new Logger();
  Logger.ErrorInfo info = new Logger.ErrorInfo("aaa", "TestApp", x.ToString());
  //将错误信息记录到文本文件中
  logger.SetErrorLog(info);
}

--------------------------------------------
web.config文件关键代码:
<system.web>
  <customErrors mode="On" defaultRedirect="Error.html">
  </customErrors>
  </system.web>

---------------------------------------------

我在一个页面引发一个异常,如果<customErrors>元素的mode设置为On,则Application_Error执行两次,其中第一次是我引发的异常执行一次
,但不明白第二次引发的异常从哪来的(第二次引发异常的信息描述为"System.Web.HttpException: 文件不存在"),什么文件不存在?
但将Mode设置为RemoteOnly就没有问题,什么呢?

------解决方案--------------------
Error.html
------解决方案--------------------
顶 高手进来吧
------解决方案--------------------
ding
------解决方案--------------------
加上Server.ClearError();
可以参考一下下面的代码:
C# code

protected void Application_Error(Object sender, EventArgs e)
{
    try
    {
        if(Convert.ToInt32(Application["tag"])>2)
        {
            Application["tag"]=1;
            return;
        }
        Application["tag"]=Convert.ToInt32(Application["tag"])+1;
        Exception objErr = Server.GetLastError().GetBaseException();
        Application["errorPage"] = Request.Url.ToString();
        Application["errorMsg"] =objErr.Message;
        Server.ClearError();
        Response.Redirect("Error.aspx");
    }
    catch{}
}

------解决方案--------------------
改为RemoteOnly
------解决方案--------------------
呵呵,没研究
------解决方案--------------------
Error.html存在吗? 
当custom errors mode="on"时 因为你是在本机调试 系统既是服务器端又是客户端 所以捕获异常后 还要作为客户端执行自定义的那个出错页 找到不 就错了
------解决方案--------------------
1、学习
------解决方案--------------------
跟踪吧。
------解决方案--------------------
呵呵,楼主在深入啊,确实没有研究过。
------解决方案--------------------
如果楼主有Error.html文件的话,确实比较奇怪,理论上说一共有两个在异常未处理时将被ASP.NET调用的事件:
Page_Error event,提供捕获在Page级别发生错误的方法。
Application_Error event,提供捕获在代码中的任何地方发生错误的方法。
先执行Page_Error,后执行Application_Error。Page_Error中处理错误之后使用Server.ClearError方法清除最后一个错误,可以避免再调用Application_Error。
------解决方案--------------------
探讨
引用:
Error.html存在吗?
当custom errors mode="on"时 因为你是在本机调试 系统既是服务器端又是客户端 所以捕获异常后 还要作为客户端执行自定义的那个出错页 找到不 就错了


存在的啊,都显示出来了啊

------解决方案--------------------
如果有类间有继承判断可能会执行两次或多次
我的环境下配置为On时只执行一次
------解决方案--------------------