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就没有问题,什么呢?

解决方案 »

  1.   

    加上Server.ClearError();
    可以参考一下下面的代码: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{}
    }Error.aspx.csprivate void Page_Load(object sender, System.EventArgs e)
    {
    if(!IsPostBack)
    {
    try
    {
    Application["tag"]=1;
    lblError.Text=this.lblErrorPage.Text+Application["errorPage"].ToString()+"<br>"+this.lblErrorMsg.Text+Application["errorMsg"].ToString();
    Artdio.MessageBox.ShowPopupWin(this,"","",30000);
    Artdio.Web.Class.WriterLog log = new Artdio.Web.Class.WriterLog( Server.MapPath(@"./Log/Error.log"));
    log.WriterError(Application["errorPage"].ToString(),Application["errorMsg"].ToString());
    }
    catch{}
    }
    }
      

  2.   

    这个文件是存在的,如果将mode设置为On,我在服务器端测试,是能显示Error.html页面的,但为什么会引发两次异常呢?
      

  3.   


    谢谢楼上的回答,但我的帖子已经说了改为RemoteOnly好用。我现在不清楚的是为什么改为On后,就引发两次Application_Error,正常应该是一次的,即我手动引发的异常。
      

  4.   

    Error.html存在吗? 
    当custom errors mode="on"时 因为你是在本机调试 系统既是服务器端又是客户端 所以捕获异常后 还要作为客户端执行自定义的那个出错页 找到不 就错了
      

  5.   


    早就跟踪过了,但是看不到哪儿出错了,直接就跳到Application_Error中了
      

  6.   

    以前asp.net1.1版本没这种问题啊
      

  7.   

    如果楼主有Error.html文件的话,确实比较奇怪,理论上说一共有两个在异常未处理时将被ASP.NET调用的事件:
    Page_Error event,提供捕获在Page级别发生错误的方法。
    Application_Error event,提供捕获在代码中的任何地方发生错误的方法。
    先执行Page_Error,后执行Application_Error。Page_Error中处理错误之后使用Server.ClearError方法清除最后一个错误,可以避免再调用Application_Error。
      

  8.   

    找到问题了,真是郁闷啊,原来在Error.htm页面中,引用的样式表没有找到,所以引发了“没有找到文件这个异常”,这也算是异常啊,以前没注意这块~