在實際開發中,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; }