【转 http://www.cnblogs.com/Sunmoonfire/archive/2010/08/26/1809026.html】
文中我们将讨论在使用客户端对象模型时,如何处理异常。将分别针对 .Net 托管客户端和和ECMAScript进行解释。
为了满足对多个服务器请求进行响应的需要,依托于异常机制,在SharePoint 2010中引入一个新类ExceptionHandlingScope。这个类包含了一些方法,用来把代码包装在一个范围内,来对ClientContext实例中的批处理命令中发生的异常进行处理。
让我们看一个例子。该例子会查询一个名为NonExistentList的列表,并更新该列表的描述属性。 当第一次执行此代码,并假设该列表不存在,将会在调用ExecuteQuery时抛出一个异常。这个异常会被捕获,并其接下来会在catch块中创建该列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public
static
void
exceptionExample()
{
ExceptionHandlingScope exScope =
new
ExceptionHandlingScope(ctx);
using
(exScope.StartScope())
{
using
(exScope.StartTry())
{
//获取列表 NonExistingList 并更新其描述
List myList = ctx.Web.Lists.GetByTitle(
"NonExistingList"
);
myList.Description =
"这是一段新的描述"
;
myList.Update();
}
using
(exScope.StartCatch())
{
// 新建一个名为 NonExistingList的列表
ListCreationInformation listCreationInfo =
new
ListCreationInformation();
listCreationInfo.Title =
"NonExistingList"
;
listCreationInfo.Description =
"在catch块中创建的"
;
listCreationInfo.TemplateType = (
int
)ListTemplateType.GenericList;
List oList = ctx.Web.Lists.Add(listCreationInfo);
}
using
(exScope.StartFinally())
{
// 更新列表 NonExistingList的描述
List myList = ctx.Web.Lists.GetByTitle(
"NonExistingList"
);
myList.Description =
"这是一段在final块中创建出来的描述"
;
myList.Update();
}
}
ctx.ExecuteQuery();
}
|
整个客户端代码块被包在一个ExceptionHandlingScope的StartScope方法内,该对象定义在客户端代码块的顶部,放在所有客户端对象操作之前。
然后,每个逻辑块(比如获取,创建和更新该列表的代码块)分别被包装在其各自的操作范围中(StartTry,StartCatch和StartFinally)。 只有在StartTry代码块中发生一个例外时StartCatch块才会被执行。StartFinally代码块将永远会被执行,不论是否发生异常。
运行后在SharePoint中可以看到如下结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<script type=
"text/ecmascript"
language=
"ecmascript"
>
var
targetWeb;
var
clientContext;
function
exceptionExample()
{
clientContext =
new
SP.ClientContext.get_current();
var
exScope =
new
SP.ExceptionHandlingScope(clientContext);
var
startScope = exScope.startScope();
var
tryScope = exScope.startTry();
// 获取NonExistingList列表并更新其描述
var
myList = clientContext.get_web().get_lists().getByTitle(
"NonExistingList"
);
myList.set_description(
"这是一段新描述"
);
myList.update();
tryScope.dispose();
var
catchScope = exScope.startCatch();
//新建一个NonExistingList列表
var
listCreationInfo =
new
SP.ListCreationInformation();
listCreationInfo.set_title(
"NonExistingList"
);
listCreationInfo.set_description(
"在catch块中创建的描述"
);
listCreationInfo.set_templateType(SP.ListTemplateType.genericList);
clientContext.get_web().get_lists().add(listCreationInfo);
catchScope.dispose();
var
finallyScope = exScope.startFinally();
// 更新列表NonExistingList的描述
var
myList = clientContext.get_web().get_lists().getByTitle(
"NonExistingList"
);
myList.set_description(
"这是一段在final块中创建的描述"
);
myList.update();
finallyScope.dispose();
startScope.dispose();
this
.clientContext.executeQueryAsync(Function.createDelegate(
this
,
this
.onSucceededCallback),Function.createDelegate(
this
,
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()"
/>
|
ExceptionHandlingScope在JavaScript中的用法几乎和在C#中相同。因为JavaScript中没有使用构造器,所以您必须手工调用scope.dispose来销毁范围对象。