首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

SharePoint 2010 客戶端物件模型異常處理:ExceptionHandlingScope 完整教學

     編輯:關於.NET

背景

SharePoint 2010 引入 ExceptionHandlingScope,允許在 ClientContext 批次執行中以 Try/Catch/Finally 結構處理異常,滿足多伺服器請求的錯誤處理需求。

.NET Managed Client 範例

場景:嘗試更新不存在的列表 NonExistingList,捕獲異常後建立該列表,最後在 Finally 更新描述。

public static void ExceptionExample()
{
    ClientContext ctx = new ClientContext("https://sp2010u/it");
    ExceptionHandlingScope exScope = new ExceptionHandlingScope(ctx);

    using (exScope.StartScope())
    {
        // Try 區塊:嘗試取得並更新列表
        using (exScope.StartTry())
        {
            List myList = ctx.Web.Lists.GetByTitle("NonExistingList");
            myList.Description = "這是一段新的描述";
            myList.Update();
        }

        // Catch 區塊:僅在 Try 拋出異常時執行
        using (exScope.StartCatch())
        {
            ListCreationInformation lci = new ListCreationInformation
            {
                Title = "NonExistingList",
                Description = "在 catch 區塊中建立的",
                TemplateType = (int)ListTemplateType.GenericList
            };
            List oList = ctx.Web.Lists.Add(lci);
        }

        // Finally 區塊:永遠執行
        using (exScope.StartFinally())
        {
            List myList = ctx.Web.Lists.GetByTitle("NonExistingList");
            myList.Description = "這是一段在 finally 區塊中建立出來的描述";
            myList.Update();
        }
    }

    ctx.ExecuteQuery(); // 批次送出,伺服端依序執行 Try/Catch/Finally
}

執行結果截圖

ECMAScript (JavaScript) 範例

可直接貼入 HTML 表單 Web 組件的原始碼編輯器中執行。

<script type="text/ecmascript" language="ecmascript">
var targetWeb, clientContext;

function exceptionExample() {
    clientContext = new SP.ClientContext.get_current();
    var exScope = new SP.ExceptionHandlingScope(clientContext);
    var startScope = exScope.startScope();
    var tryScope = exScope.startTry();

    // Try
    var myList = clientContext.get_web().get_lists().getByTitle("NonExistingList");
    myList.set_description("這是一段新描述");
    myList.update();
    tryScope.dispose();

    // Catch
    var catchScope = exScope.startCatch();
    var lci = new SP.ListCreationInformation();
    lci.set_title("NonExistingList");
    lci.set_description("在 catch 區塊中建立的描述");
    lci.set_templateType(SP.ListTemplateType.genericList);
    clientContext.get_web().get_lists().add(lci);
    catchScope.dispose();

    // Finally
    var finallyScope = exScope.startFinally();
    myList = clientContext.get_web().get_lists().getByTitle("NonExistingList");
    myList.set_description("這是一段在 finally 區塊中建立的描述");
    myList.update();
    finallyScope.dispose();

    startScope.dispose();

    clientContext.executeQueryAsync(
        Function.createDelegate(this, onSucceededCallback),
        Function.createDelegate(this, onFailedCallback));
}

function onSucceededCallback(sender, args) { alert("完成!"); }
function onFailedCallback(sender, args) {
    alert('請求失敗. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());
}
</script>
<input id="Button1" type="button" value="執行代碼" onclick="exceptionExample()" />

關鍵差異提醒

  • JavaScript 無建構子語法,必須手動呼叫 dispose() 釋放 Scope 物件。
  • ExecuteQuery (C#) / executeQueryAsync (JS) 為批次提交邊界,伺服端在此時依序執行 Scope 內邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved