asp.net和ajax未捕获异常处理机制

来源:互联网 发布:mac 输入emoji 编辑:程序博客网 时间:2024/05/16 18:26

asp.net和ajax未捕获异常处理机制

    这里的异常处理主要是指开发人员在业务代码中未捕获的异常。未捕获异常处理的目的:
    1:在应用程序域级别对异常类型进行处理;
    2:在处理的基础上,可以将错误信息记录日志;
    3:以友好的方式提示最终用户页面发生了错误。

    .NET提供了四种错误处理机制,它们有一定的优先级顺序:Page_Error事件>ErrorPage属性>Application_Error事件> <customErrors>配置项。下面分别介绍这四种错误处理机制的用法。最后介绍ajax如果捕获服务器端代码抛出的异常。

1:Page_Error事件
    Page_Error 事件提供一种捕获在页级别出现的错误的方法。


   view plaincopy to clipboardprint?
protected void Page_Error(object sender, EventArgs e)  
   {  
       Exception objErr = Server.GetLastError().GetBaseException();  
       Response.Write("Error:" + objErr.Message);  
       Server.ClearError();  
   }  
 protected void Page_Error(object sender, EventArgs e)
    {
        Exception objErr = Server.GetLastError().GetBaseException();
        Response.Write("Error:" + objErr.Message);
        Server.ClearError();
    } 

2.ErrorPage属性
    要让ErrorPage属性能够发挥作用,<customErrors>配置项中的mode属性必须设为"On"。
    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
    如果Page_Error和ErrorPage都存在,当抛出Exception时,页面执行顺序是怎样的呢?页面会先执行Page_Error事件处理函数,如果Page_Error()事件中调用函数Server.ClearError()清除异常信息,则不会跳转到ErrorPage属性指定页面;如果没有调用Server.ClearError(),Exception信息会继续向上抛,页面会跳转到ErrorPage指定页面。这也就证明了优先级顺序:Page_Error事件>ErrorPage属性。
    这里需要指出,如果你没指定ErrorPage属性,则自动导向到GenericErrorPage.htm。

3.Application_Error事件
      与Page_Error 事件相类似,您可使用Application_Error事件捕获发生在应用程序中的错误。由于事件发生在整个应用程序范围内,因此您可记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误。在Global.asax文件中添加如下代码就OK了。
    个人更喜欢这种不需要配置的写法。因为可以连错误处理和转向都处理了。
    view plaincopy to clipboardprint?
protected void Application_Error(object sender, EventArgs e)  
    {  
        Exception ex = Server.GetLastError().GetBaseException();  
        Response.Write("Error:" + ex.Message);  
        //清除Exception,避免继续传递给上一级处理,上级是指<CustomerErrors>配置节了  
        Server.ClearError();  
        //以上部分可以理解为异常处理  
        //以下部分处理转向  
        Response.Redirect("err.aspx");  
    } 
protected void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError().GetBaseException();
        Response.Write("Error:" + ex.Message);
        //清除Exception,避免继续传递给上一级处理,上级是指<CustomerErrors>配置节了
        Server.ClearError();
        //以上部分可以理解为异常处理
        //以下部分处理转向
        Response.Redirect("err.aspx");
    }

4.<customErrors>配置项
       配置文件web.config中的<customErrors> 配置节,可将重定向页指定为默认的错误页defaultRedirect或者根据引发的 HTTP 错误代码指定特定页。如果发生在应用程序以前的任一级别都未捕获到的错误,则显示这个自定义页。
<customErrors mode="On" defaultRedirect="~/ErrorHandling/ApplicationError.html">
      <error statusCode="404" redirect="~/ErrorHandling/404.html" />
</customErrors>   
       同样,如果Application_Error和<customerErrors>同时存在,也存在执行顺序的问题。因为优先级 Application_Error事件> <customErrors>配置项,所以发生应用程序级错误时,优先执行Application_Error事件中的代码,如果 Application_Error事件中调用了Server.ClearError()函数,<customerErrors>配置节中的 defaultRedirect不起作用,因为Exception已经被清除;如果Application_Error事件中没用调用了 Server.ClearError()函数,错误页会重新定位到defaultRedict指定的URL页面,为用户显示友好出错信息。

5.ajax处理.NET中的异常
    以上介绍的四种机制,都无法处理ajax调用中服务器端抛出的异常。故需要如下的处理方式:
    假设ajax调用函数(其中onsubmit_back是回调函数)如下
    LoginInfo.SubmitData(uId,pwd,onsubmit_back);
    回调函数如下:       
    view plaincopy to clipboardprint?
function onsubmit_back(response)  
        {  
            //判断是否有错误发生  
            if(response.error != null)  
            {  
                alert(response.error.Message);  
                return;  
            }  
            //以下可以为正常业务处理代码             
        } 
function onsubmit_back(response)
        {
            //判断是否有错误发生
            if(response.error != null)
            {
                alert(response.error.Message);
                return;
            }
            //以下可以为正常业务处理代码          
        }

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luminji/archive/2009/10/15/4676330.aspx