本文中我們將討論在使用客戶端對象模型時,如何處理異常。將分別針對 .Net 托管客戶端和和ECMAScript進行解釋。
為了滿足對多個服務器請求進行響應的需要,依托於異常機制,在 SharePoint 2010中引入一個新類ExceptionHandlingScope。這個類包含了一些 方法,用來把代碼包裝在一個范圍內,來對 ClientContext實例中的批處理命令 中發生的異常進行處理。
讓我們看一個例子。該例子會查詢一個名為NonExistentList的列表,並更新 該列表的描述屬性。 當第一次執行此代碼,並假設該列表不存在,將會在調用 ExecuteQuery時拋出一個異常。這個異常會被捕獲,並其接下來會在catch塊中 創建該列表。
.Net 對象模型
以下是在控制台應用程序中的實現:
01 public static void exceptionExample()
02 {
03 ClientContext ctx = new ClientContext ("http://sp2010u/it");
04 ExceptionHandlingScope exScope = new ExceptionHandlingScope(ctx);
05 using (exScope.StartScope())
06 {
07 using (exScope.StartTry())
08 {
09 //獲取列表 NonExistingList 並更新其描 述
10 List myList = ctx.Web.Lists.GetByTitle("NonExistingList");
11 myList.Description = "這是一段新的描述 ";
12 myList.Update();
13 }
14 using (exScope.StartCatch())
15 {
16 // 新建一個名為 NonExistingList的列表
17 ListCreationInformation listCreationInfo = new ListCreationInformation();
18 listCreationInfo.Title = "NonExistingList";
19 listCreationInfo.Description = "在 catch塊中創建的";
20 listCreationInfo.TemplateType = (int) ListTemplateType.GenericList;
21 List oList = ctx.Web.Lists.Add (listCreationInfo);
22 }
23 using (exScope.StartFinally())
24 {
25 // 更新列表 NonExistingList的描述
26 List myList = ctx.Web.Lists.GetByTitle("NonExistingList");
27 myList.Description = "這是一段在final 塊中創建出來的描述";
28 myList.Update();
29 }
30 }
31 ctx.ExecuteQuery();
32 }
整個客戶端代碼塊被包在一個ExceptionHandlingScope的StartScope方法內 ,該對象定義在客戶端代碼塊的頂部,放在所有客戶端對象操作之前。
然後,每個邏輯塊(比如獲取,創建和更新該列表的代碼塊)分別被包裝在 其各自的操作范圍中(StartTry,StartCatch和 StartFinally)。 只有在 StartTry代碼塊中發生一個例外時StartCatch塊才會被執行。StartFinally代碼 塊將永遠會被執行,不論是否發生異常。
運行後在SharePoint中可以看到如下結果:
在ECMAScript中使用
下面的代碼可以放在一個HTML表單Web部件中運行(直接貼在WebPart屬性- >源編輯器中):
01 <script type="text/ecmascript" language="ecmascript">
02 var targetWeb;
03 var clientContext;
04 function exceptionExample()
05 {
06 clientContext = new SP.ClientContext.get_current ();
07 var exScope = new SP.ExceptionHandlingScope (clientContext);
08 var startScope = exScope.startScope();
09 var tryScope = exScope.startTry();
10 // 獲取NonExistingList列表並更新其描述
11 var myList = clientContext.get_web().get_lists ().getByTitle("NonExistingList");
12 myList.set_description("這是一段新描述");
13 myList.update();
14 tryScope.dispose();
15
16 var catchScope = exScope.startCatch();
17 //新建一個NonExistingList列表
18 var listCreationInfo = new SP.ListCreationInformation();
19 listCreationInfo.set_title("NonExistingList");
20 listCreationInfo.set_description("在catch塊中創建的描 述");
21 listCreationInfo.set_templateType (SP.ListTemplateType.genericList);
22 clientContext.get_web().get_lists().add (listCreationInfo);
23 catchScope.dispose();
24
25 var finallyScope = exScope.startFinally();
26 // 更新列表NonExistingList的描述
27 var myList = clientContext.get_web().get_lists ().getByTitle("NonExistingList");
28 myList.set_description("這是一段在final塊中創建的描 述");
29 myList.update();
30 finallyScope.dispose();
31 startScope.dispose();
32
33 this.clientContext.executeQueryAsync (Function.createDelegate(this, this.onSucceededCallback),Function.createDelegate(this, this.onFailedCallback));
34 }
35 function onSucceededCallback(sender, args)
36 {
37 alert("完成!");
38 }
39
40 function onFailedCallback(sender, args) {
41 alert('請求失敗. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace ());
42 }
43 </script>
44 <input id="Button1" type="button" value="運行代碼" onclick="exceptionExample()" />
ExceptionHandlingScope在JavaScript中的用法幾乎和在C#中相同。因為 JavaScript中沒有使用構造器,所以您必須手工調用scope.dispose來銷毀范圍 對象。