在实际开发中,web service的使用变得日益普及,特别是在移动互联网上,移动终端响应与请求数据往往是连接web service得到的。往往web service发布在服务器端,也有可能发布在其他地方,总之是与客户端相分离的。
所以,客户端请求web服务的异常处理与本地操作的异常处理是不同的。按照原理来说,web服务的传递参数是以XML为格式的。
客户端请求web服务有三种情况:
1.web服务没有响应。
2.请求数据在执行过程中发生异常,导致执行错误。
3.得到正确的执行结果。
web服务没有响应原因可能是网络中断或web服务没有启动。
执行异常,有可能是SQL指令错误或参数错误或者是其他程序异常等。
web服务没有响应的异常,可以在客户端请求web服务时捕获到,即try{}catch{MessageBox.Show("网络中断,请稍后再试!");}。
web服务中程序的异常的处理可以分为两种情况:
1.定义一组返回值标准,直接将错误信息抛给客户端。
2.记录到web日志中,同时客户端捕获异常。
本次博客只写第一种情况。
异常的抛出主要为了在程序出现问题时方便调试使用的或者尽量避免不必要的异常处理,使程序更严谨、健壮。
按照对数据的操作,分成查询、添加/删除/修改两种情况说明:
1.查询时:
若查询正常,则返回正常结果,例如结构如下:
<?xml version="1.0" encoding="GB2312" ?>
<NewDataSet>
<STUDENT>
<SERIAL_NO>232</SERIAL_NO>
<DEPT_CODE>2029</DEPT_CODE>
<DEPT_NAME>化工学院</DEPT_NAME>
</STUDENT>
<STUDENT>
<SERIAL_NO>232</SERIAL_NO>
<DEPT_CODE>2029</DEPT_CODE>
<DEPT_NAME>化工学院</DEPT_NAME>
</STUDENT>
</NewDataSet>
若出现异常,如下:
<?xml version="1.0" encoding="GB2312" ?>
<NewDataSet>
<Exception>
<Exception_Flag>1</Exception_Flag>
<Exception_Value>没有查询到结果</Exception_Value>
<Exception_Error>没有查询到结果!</Exception_Error>
</Exception>
</NewDataSet>
2. 添加/删除/修改成功时,返回结构也定义成xml格式如下:
<?xml version="1.0" encoding="GB2312" ?>
<NewDataSet>
<Exception>
<Exception_Flag>0</Exception_Flag>
<Exception_Value>执行成功</Exception_Value>
<Exception_Error></Exception_Error>
</Exception>
</NewDataSet>
若失败,有异常时,格式如下:
<?xml version="1.0" encoding="GB2312" ?>
<NewDataSet>
<Exception>
<Exception_Flag>2</Exception_Flag>
<Exception_Value>操作发生异常</Exception_Value>
<Exception_Error>Exception.message()</Exception_Error>
</Exception>
</NewDataSet>
以上是web服务端的返回值,即请求web服务都会返回xml文档,解析后知道操作是否成功,有无异常。
程序解析如下:
public static List<STUDENT> GetSTUDENT(string strXml, out int flag, out string strValue, out string strError)
{
flag = 0;
strValue = "";
strError = "";
List<STUDENT> lstSTUDENT = new List<STUDENT>();
//Xml解析
XmlDocument doc = new XmlDocument();
//加载XML字符串
doc.LoadXml(strXml);
XmlNodeList xxList = doc.GetElementsByTagName("NewDataSet"); //取得节点名为NewDataSet的集合
foreach(XmlNode fatherNode in xxList)
{
XmlNodeList childList = fatherNode.ChildNodes;
foreach(XmlNode xxNode in childList)//一个Object集合
{
STUDENT STUDENT = new STUDENT();
XmlNodeList childList2 = xxNode.ChildNodes;
foreach(XmlNode node in childList2)
{
String temp = node.Name;
switch(temp)
{
case "NAME": //姓名
STUDENT.Name = node.InnerText;
break;
case "SEX"://性别
STUDENT.Sex = node.InnerText;
break;
case "DATE_OF_BIRTH"://出生日期
STUDENT.Date_Of_Birth = DateTime.Parse(node.InnerText);
break;
case "NATION"://民族
STUDENT.Nation = node.InnerText;
break;
case "IDENTITY"://身份
STUDENT.Identity = node.InnerText;
break;
case "Exception_Flag"://异常标识
flag = Int32.Parse(node.InnerText);
break;
case "Exception_Value"://异常提示
strValue = node.InnerText;
break;
case "Exception_Error"://异常详细描述
strError = node.InnerText;
break;
default:
break;
}
}
lstSTUDENT.Add(STUDENT);
}
}
return lstSTUDENT;
}