日期:2014-05-16  浏览次数:20751 次

彰显程序的美丽与魅力——Ajax系列之四之错误处理

一个让用户满意的程序不是不会出错,而是出错之后仍然给用户留下一丝温馨的感觉;

一个远见卓识的程序猿,肯定会给自己留条后路来保持程序的扩展性;

一个少挨骂维护猿的程序,肯定是针对错误有着良好的处理;

无论你是用户还是负责人;无论你是开发人猿还是维护人猿;

处理好程序中的错误,彰显程序的美好的一面是我们共同的愿望,好比一只孔雀,把自己美丽的一面展现出来,既满足了别人也舒适了自己,何乐为不为?

 

好吧,意识到错误处理的魅力后,就让我们走进Ajax的容错处理!

 

 一、错误的通用设置

说到通用设置,第一反应就是去配置文件中设置。

    <!--错误页配置-->
    <customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>


除了在Web.config文件中修改customErrors配置节的属性为On外,还需要在aspx页面的ScriptManager(脚本统一管理)添加相应的属性。

        <%--错误页配置--%>
  <asp:ScriptManager ID="ScriptManager1" runat="server" AllowCustomErrorsRedirect="true">
  </asp:ScriptManager>


如果从程序的整体来看,web.config文件好比是公路上的路标,指示每部程序(相当于是一部car)怎么走;每一个aspx页面相当于一个收费站,如果想要通过页面显示出既定的错误,那么就需要得到收费站的管卡,而页面中的ScriptManager,俗称脚本统一管理器,AllowCustomErrorsRedirect的属性就是起到管卡的作用。

 

经过上面两道管卡,我们就可以在处理程序的界面中,添加抛出异常的代码就可以将已经定义好错误处理页Error.aspx显示出来了,配置文件中要注意路径的填写。

protected void Button1_Click(object sender, EventArgs e)
	{
        //抛出异常
		throw new Exception();
	}

 

 

 二、自定义错误

如果一个程序没有自定义的错误,谈何程序的魅力?在程序中添加自定义错误,既可以给客户以舒适(至少不反感)的体验还可以给开发和维护人员以相应的提示。这才算是一种比较好的做法。

那么,在Ajax中怎么自定义错误呢?

简单的总结了两种方法,一种是从客户端发起的错误处理,另一种是在服务器端定义的错误处理。

 

1、从客户端发起的错误处理

首先,关掉ScriptManager的AllowCustomErrorsRedirect属性,然后在它的OnAsyncPostBackError属性中指明异步刷新的事件。

<%--AllowCustomErrorsRedirect属性设置为false,配合后台的自定义错误使用--%>
<asp:ScriptManager ID="ScriptManager1" runat="server" AllowCustomErrorsRedirect="false" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError">
</asp:ScriptManager>


然后,在页面的C#后台添加自定义的错误信息和异步刷新事件中要显示的错误信息。

	protected void Button1_Click(object sender, EventArgs e)
	{
        //自定义错误处理,配合web.config文件中的错误配置节点customErrors(设置为on的时候才生效,同时还要制定错误页)和AllowCustomErrorsRedirect(是否允许customErrors)使用
		throw new Exception("Custom Error!");
	}
    //异步刷新出现错误时,触发的事件
	protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
	{
        //客户端接受到的错误的信息
        ScriptManager.GetCurrent(this).AsyncPostBackErrorMessage = e.Exception.Message;
    }

 

第三部,在前台界面中编写Ajax的核心技术支持——javascript代码

<script type="text/javascript" language="javascript">
	//endRequest相应Request时最后触发