假如我们没有给输入参数UserName赋值,那么在If节点中Condition条件表达式中的UserName.Length就会出现意外。本节我们将为工作流节点增加错误的捕捉和处理的能力。
任务 1 – 编写新的测试方法观察错误发生的情况
注意我们传入一个长度为0的UserName,程序不会出现错误。要输入null给UserName ,我们在创建工作流实例的时候,不指定任何参数就可以了。
- 打开SayHelloFxiture.cs文件并添加新的测试方法ShouldHandleNullUserName :
[TestMethod]
public void ShouldHandleNullUserName()
{
// Invoking with no arguments
WorkflowInvoker.Invoke(new SayHello());
}
- 按CTRL+R,T 或者右键点击此方法后选择Run Test 来运行测试
- 测试将会失败,因为我们在If节点的条件表达式中使用UserName.Length,但UserName是个null值
HelloWorkflow.Tests.SayHelloFixture.ShouldHandleNullUserName threw exception: System.NullReferenceException: Object reference not set to an instance of an object.
任务 2 – 在工作流中添加Try/Catch节点
为了处理这个错误,可以在使用参数前验证参数是否有效,或者简单捕捉意外并处理掉。本例将进行意外捕捉。
- 在设计器中SayHello.xaml ,在工具栏的Error Handling 组中选择TryCatch 节点并拖动到Sequence节点内的顶部
- 使用TryCatch节点来处理在工作流执行中发生的意外。我们可以处理这些意外,也可以通过Throw 节点重新抛出新的意外
- 在TryCatch节点的Try部分或者Catches部分内部的节点执行完毕后,Finally 部分的任何节点都会被执行
- 将已有的If 节点拖动到TryCatch节点的Try 部分
- 在Catches 部分,点击Add new catch 添加NullReferenceException
- 从下拉框中选择System.NullReferenceExeption
- 当你铺捉到此意外的时候,我们可以处理也可以重新抛出新的意外。本例中,我们使用Throw抛出一个新的意外ArgumentNullException 通知调用程序必须先初始化输入参数UserName :
- 拖动Throw节点到Catches部分
- 在属性窗口输入Exception 表达式:New ArgumentNullException("UserName")
- 我们已经捕捉了之前出现的NullReferenceException,新的意外ArgumentNullException是我们设想好要通知调用程序的,所以我们的测试方法要进行适当的修改,使之预期会发生此意外
- 打开SayHelloFixture.cs并修改ShouldHandleNulException测试方法:
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ShouldHandleNullUserName()
{
// Invoking with no arguments
WorkflowInvoker.Invoke(new SayHello());
}
验证
- 按CTRL+SHIFT+B编译
- 按CTRL+R,A运行所有的测试
- 测试应该通过