一个好的Web应用程序,强大的异常处理是少不了的。最近在学习Ajax的过程中,我总结了几种不同情况下的处理异步调用中异常的不同办法;想分享给大家;
1,在客户端调用Web Service代理时发生异常的处理办法
2,使用Asp.NetAjax内建的异常处理方法
3,Web.Config中customError节中设置错误跳转页
此篇博客总结的是:在客户端调用Web Service代理时发生异常的处理方法。
由于Ajax的异步效果,再加上后台的运行,让我们很难判断某次对服务器的请求是否顺利完成,浏览器对Ajax程序运行时发生的异常无能为力;
Ajax的使用,使Web应用程序从客户端想服务器端发起异步Http协议请求,在理想情况下是没有问题的,但是Web程序的运行并不是一直顺利的,它有着很多不确定性——网络故障、。。。开发者的粗心大意,一旦出现问题就会导致异步请求失败。
在开发中提高性能,尽量避免这些异常,但是有些异常是避免不了的,这样的话,我们就该处理这些异常。
当然,Asp.Net Ajax也考虑到了这些,并提供了一整套针对异步回调过程中发生的异常处理机制;
进入主题:在客户端调用Web Service代理时发生异常的处理办法;
客户端调用Web Service代理的语法:
[NameSpace].[ClassName].[MethodName](param1,param2,...,onSuceeded,onFailed)
——其中:onSuceeded:成功时调用的函数;
onFailed:失败时调用的函数;(本博客介绍的重点之处)
onFailed回调函数会接收一个类型为Sys.Net.WebServiceError的参数,表示异常对象。如下:
Function onFailed(error){
//显示异常信息
//处理异常信息
}
注:
ASP.NET AJAX的客户端Sys.Net.WebServiceError类型封装了异步请求服务器时可能发生的异常,它提供了若干个只读的属性,提供了对异常信息的详细描述。Sys.Net.WebServiceError类型的属性如下(在接下来的例子将会用到这些属性):
属 性 |
描 述 |
exceptionType |
获取服务器端异常的具体类型 |
message |
获取详细的异常描述信息 |
statusCode |
获取造成异常的HTTP响应的状态码 |
stackTrace |
获取服务器端异常的栈跟踪信息 |
timedOut |
获取一个布尔值,表示异常是否是由于网络连接超时造成的 |
例子:
服务器端:ErroHandling.asmx
定义了两个方法GetDivision(int a,int b):实现两个整数相除,并返回相除结果; int Timeout():
<%@ WebService Language="C#" Class="ErrorHandling" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using System.Threading;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ErrorHandling : System.Web.Services.WebService
{
[WebMethod]
public int GetDivision(int a, int b)
{
return a / b;
}
[WebMethod]
public int Timeout()
{
Thread.Sleep(5000);
return 0;
}
}
(注意:Web Service类要添加[ScriptService]标记;在方法上标记[WebMethod]表示:服务器端释放该方法,客户端可访问服务器端的该方法)
客户端调用服务器端的GetDivision(int a,int b)函数,并传入两个参数:2,0;程序借助Asp.Net Ajax异步通信层将参数发送至服务器,服务器完成计算后将结果返回至客户端;
显然,因为输入的被除数为0,服务器端执行时必定要抛出异常;但是
并没有在服务器端做异常处理,此时客户端也许会显示异常错误,但是如果客户端并没有显示异常错误,那么客户端的用户就要无限期的等下去,可见是多么的不合理;那么如何在客户端处理此类异常?
新建Asp.Net页面5_ClientProxy.aspx;前台添加ScriptManager控件(
和UpdatePanel控件联合使用可以实现页面异步局部更新的效果),及ErrorHandling.asmx的引用:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="ErrorHandling.asmx" />
</Services>
</asp:ScriptManager>
添加两个按钮,并且分别在单击事件中调用getDivision(int a,int b)和timeout()方法:(注:getDivision()函数传入的参数为5,0:即被除数为0)
<input type="button" value="getDivision" onclick="getDivision(5, 0)" />
<input type="button" value="timeout" onclick="timeout()" />
<script language="javascript" type="text/javascript">
ErrorHandling.set_timeout(2000);
//getDivision(int a,int b)方法:
function getDivision(a, b)
{
function getDivision(a, b)
{
ErrorHandling.GetDivision(a, b, succeededCallback,failedCallback);
//调用服务器端GetDivision(int a,int b)函数,成功时的回调函数为succeededCallback(),失败时的回调函数为failedCallback()
}
}
function timeout()
{
ErrorHandling.Timeout(succeededCallback, failedCallback);
}
function succeededCallback(result)
{
alert(result)
}
function failedCallback(error, userContext, methodName)
{
// ASP.NET AJAX的客户端Sys.Net.WebServiceError类型封装了异步请求服务器时可能发生的异常,它提供了若干个只读的属性,提供了对异常信息的详细描述。Sys.Net.WebServ- iceError类型的属性,如下:
//属 性 描 述
//exceptionType 获取服务器端异常的具体类型
//message 获取详细的异常描述信息
//statusCode 取造成异常的HTTP响应的状态码
//stackTrace 获取服务器端异常的栈跟踪信息
//timedOut 获取一个布尔值,表示异常是否是由于网络连接超时造成的
var message = String.format(
"Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}",
error.get_timedOut(),
error.get_message(),
error.get_exceptionType(),
error.get_stackTrace());
alert("Error at " + methodName + "\n\n" + message);
}
</script>
点击"getDivision"按钮:因为被除数为0,有异常,所以调用回调函数failedCallback(),运行结果如下图;假如传入的参数为5,1,则调用succeededCallback()函数:
点击"timeout"按钮:因为睡眠时间为5秒,超过设定的2秒,所以所以调用回调函数failedCallback(),运行结果如下图;假如设定6秒,则调用succeededCallback()函数:
总结:
本篇博客主要讲:在客户端调用Web Service代理时发生异常的处理办法,以及Sys.Net.WebServiceError类型的属性的使用