WF4.0 基础篇 (十一) Excetpion 异常 与 TerminateWorkflow 结束流程

本节主要介绍WF的异常产生方式;WF流程结束方式;以及Throw,TryCatch,Rethrow ,TerminateWorkflow 的使用

 

本文例子下载:

http://files.cnblogs.com/foundation/ExceptionWorkflow.rar

本文例子说明

image.png

image.png


WF的异常产生方式与流程结束方式


WF的异常可由以下方式产生

使用[Throw Activity] 抛出异常

使用[Throw]抛出异常,不会使宿主崩溃

如果使用VS调试,不会[Throw]处断住,

异常可被实例的[OnUnhandledException]方法捕获

[Activity]中的Code运行错误产生异常

public sealed class ExceptionActivity : CodeActivity

{

protected override void Execute(CodeActivityContext context)

{

int v = 1 - 1;

double i = 1 / v;

}

}

代码运行错误产生异常,不会使宿主崩溃,

如果使用VS调试,在异常处断住

异常可被实例的[OnUnhandledException]方法捕获

 

WF流程结束方式

1. WF实例如果在运行过程中没有出现问题,[ActivityInstanceState 实例状态]会由[Executing 执行中] 变为 [Closed 关闭]

2. 如果流程

  • 被调用Terminate 方法

  • 遇到[TerminateWorkflow Activity]

  • 产生异常时没有用[WorkflowApplication.OnUnhandledException]

  • 产生异常时指定[UnhandledExceptionAction.Terminate]

[ActivityInstanceState 实例状态]会由[Executing 执行中] 变为 [faulted 有问题]

 

3. 如果流程

  • 被调用Canceled 方法

  • 产生异常时指定[UnhandledExceptionAction.Canceled ]

[ActivityInstanceState 实例状态]会由[Executing 执行中] 变为 [Canceled 取消]

 

4.如果流程

  • 被调用Aborted 方法

  • 产生异常时指定[UnhandledExceptionAction.Aborted ]

流程会运行失败,并触出发实例的Aborted

运行失败的流程无[ActivityInstanceState 实例状态]

 

5. [ActivityInstanceState 实例状态]的 [Closed 关闭],[faulted 有问题],[Canceled 取消]都表示流程结束,并触出发实例的Completed

 

6. 流程[Aborted 失败],流程会即时消失,触出发实例的Aborted,不会触出发实例的Completed


使用WorkflowApplication.OnUnhandledException 处理异常


使用实例的[OnUnhandledException]可以处理异常.

处理Code异常

用于产生中Code生异常的[Activity]

 

ExceptionActivity

public sealed class ExceptionActivity : CodeActivity

{

protected override void Execute(CodeActivityContext context)

{

int v = 1 -1;

double i = 1 / v;

}

}

流程

image.png

 

无UnhandledExceptionAction方式

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

//==============================================================

 

#region //处理Code异常,[UnhandledExceptionAction]方式

 

static void exceptionActivityWorkflow_None()

{

WorkflowApplication instance = new WorkflowApplication(new ExceptionActivityWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.Aborted = aborted;

 

instance.Run();

}

 

#endregion

image.png

 

当不用[WorkflowApplication.OnUnhandledException]方法处理异常时,流程正常结束.会调用实例的[completed],但状态为[faulted]

 

UnhandledExceptionAction.Abort

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

//==============================================================

 

#region //处理Code异常,[UnhandledExceptionAction.Abort]方式

static void exceptionActivityWorkflow_Abort()

{

WorkflowApplication instance = new WorkflowApplication(new ExceptionActivityWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.OnUnhandledException = unhandledException_Abort;

instance.Aborted = aborted;

 

instance.Run();

}

 

static UnhandledExceptionAction unhandledException_Abort(WorkflowApplicationUnhandledExceptionEventArgs e)

{

System.Console.WriteLine("unhandledException_Abort:{0}", e.UnhandledException.Message);

return UnhandledExceptionAction.Abort;

}

#endregion

image.png

 

当用[UnhandledExceptionAction.Abort]方式处理异常时,流程被结束.不会调用实例的[completed],会调用实例的[Aborted]

 

 

UnhandledExceptionAction.Terminate

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

//==============================================================

 

#region //处理Code异常,[UnhandledExceptionAction.Terminate]方式

static void exceptionActivityWorkflow_Terminate()

{

WorkflowApplication instance = new WorkflowApplication(new ExceptionActivityWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.OnUnhandledException = unhandledException_Terminate;

instance.Aborted = aborted;

 

instance.Run();

}

 

static UnhandledExceptionAction unhandledException_Terminate(WorkflowApplicationUnhandledExceptionEventArgs e)

{

System.Console.WriteLine("unhandledException_Abort:{0}", e.UnhandledException.Message);

return UnhandledExceptionAction.Terminate;

}

#endregion

image.png

 

当用[UnhandledExceptionAction.Abort]方式处理异常时,流程正常结束.会调用实例的[completed],但状态为[faulted]

 

UnhandledExceptionAction.Cancel方式

1.如果异常出现在[CancellationScope 取消容器],当[UnhandledExceptionAction]方法的返回值为[Cancel],会调用[CancellationScope]的[CancelHandler]部分

2.完成[CancelHandler]部分后,流程结束.会调用实例的[OnCompleted ]

具体例子见 [CancellationScope 取消容器主题

 

 

处理[Throw Activity]异常

 

Throw 在流程中抛出异常

类名

System.Activities.Statements.Throw

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法]

[Exception] 属性 的类型为 InArgument<Exception>

功能说明

要为[Exception]指定一个基于[System.Exception ]的派生类

image.png

 

 

自定义异常类

myException

public class myException : System.Exception

{

public myException(string ms)

base(ms)

{

}

}

流程

image.png

 

无UnhandledExceptionAction方式

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

//==============================================================

 

#region //处理[Throw Activity]异常,[UnhandledExceptionAction]方式

static void throwWorkflow_None()

{

WorkflowApplication instance = new WorkflowApplication(new ThrowWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

 

instance.Aborted = aborted;

 

instance.Run();

}

#endregion

 

image.png

当不用[WorkflowApplication.OnUnhandledException]方法处理异常时,流程正常结束.会调用实例的[completed],但状态为[faulted]

 

UnhandledExceptionAction.Abort

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

//==============================================================

#region //处理[Throw Activity]异常,[UnhandledExceptionAction.Abort]方式

static void throwWorkflow_Abort()

{

WorkflowApplication instance = new WorkflowApplication(new ThrowWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.OnUnhandledException = unhandledException_Abort;

instance.Aborted = aborted;

 

instance.Run();

}

#endregion

image.png

 

当用[UnhandledExceptionAction.Abort]方式处理异常时,流程被结束.不会调用实例的[completed],会调用实例的[Aborted]

 

UnhandledExceptionAction.Terminate

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

//==============================================================

#region //ä|¤¨ª[Throw Activity]°¨¬¡ê,[UnhandledExceptionAction.Terminate]¤?º?

static void throwWorkflow_Terminate()

{

WorkflowApplication instance = new WorkflowApplication(new ThrowWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.OnUnhandledException = unhandledException_Terminate;

instance.Aborted = aborted;

 

instance.Run();

}

#endregion

image.png

 

当用[UnhandledExceptionAction.Abort]方式处理异常时,流程正常结束.会调用实例的[completed],但状态为[faulted]

 

UnhandledExceptionAction.Cancel方式

1.如果异常出现在[CancellationScope 取消容器],当[UnhandledExceptionAction]方法的返回值为[Cancel],会调用[CancellationScope]的[CancelHandler]部分

2.完成[CancelHandler]部分后,流程结束.会调用实例的[OnCompleted ]

具体例子见 [CancellationScope 取消容器主题

 


TryCatch 与 Catch<T> 异常捕获


 

TryCatch

类名

System.Activities.Statements.TryCatch

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel 方法]

override 了 [CanInduceIdle]属性

[Catches]属性 的类型为[Collection<Catch>]

[Finally]属性 的类型为[Activity]

[Try]属性 的类型为[Activity]

[Variables] 属性 的类型为[Collection<Variable>]

 

Catch<T>

类名

System.Activities.Statements.Catch<TException>

文件

System.Activities.dll

结构说明

继承 Object

是一个 sealed类

范型约束 Catch<TException> : Catch where TException : global::System.Exception

[ExceptionType ]属性 的类型为[Type]

[Action]属性 的类型为[ActivityAction<TException>]

 

功能说明

1. [TryCatch]对[Throw Activity]与[Code 异常]都有效,如果异常被捕获,就不会被抛出,流程会继续向下执行

2. [TryCatch] 类似于 C# 中的 Try catch 构造, 执行 Try 块中出现异常时将执行与该异常最匹配的 Catch 块 ,找到不匹配的 catch 时会将捕获的异常继续抛出,工作流将被终止

3. [TryCatch] 有一个 [Try],用于放置要执行的[Activity]

4. [TryCatch] 有一个 [Catches],用于放置捕获异常的[Catch<T>],如果 [TryCatch]中没的[Catch<T>],异常将会被直接抛出

5. [TryCatch] 有一个 [Finally] 块在 [Try] ,[Catchs]完成后执行。无论是否有异常,都会执行 [Finally]

6. [TryCatch]中可以定义变量

 

1. [Catch<T>] 只能在 [TryCatch] 内部的[Catches]中使用

2. [Catch<T>] 表示要在[ TryCatch ]中使用的一个 catch 块。

3. 如果在执行[Try] 块中出现异常时,[TryCatch] 会查找匹配的[ Catch]的异常的类型。

4. 使用[Catch<T>],要指定要用其捕获的异常类型,可以使用[System.Exception]捕获所有异常

image.png

 

5. [Catch<T>]有一临时参数[exception]用于得到异常信息

image.png

 

image.png

 

例:基本使用

1. 创建一code activity 名为[ExceptionActivity],在Execute中产生一段代码异常

2. 创建一个继承[ System.Exception]名为[myException]的自定义异常信息类

 

code activity

ExceptionActivity

public sealed class ExceptionActivity : CodeActivity

{

protected override void Execute(CodeActivityContext context)

{

int v = 1 -1;

double i = 1 / v;

}

}

自定义异常信息类

myException

public class myException : System.Exception

{

public myException(string ms)

base(ms)

{

}

}

流程

121709_1012_WF4016.png

宿主

 

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

 

static UnhandledExceptionAction unhandledException_Terminate(WorkflowApplicationUnhandledExceptionEventArgs e)

{

System.Console.WriteLine("unhandledException_Abort:{0}", e.UnhandledException.Message);

return UnhandledExceptionAction.Terminate;

}

 

//==============================================================

 

 

static void tryCatchWorkflow()

{

WorkflowApplication instance = new WorkflowApplication(new TryCatchWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.OnUnhandledException = unhandledException_Terminate;

instance.Aborted = aborted;

 

instance.Run();

}

结果

image.png

 

 

 


Rethrow 再次引发异常


类名

System.Activities.Statements.Rethrow

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法]

功能说明

[Rethrow][Throw]功能类似,用于产生异常

[Rethrow][Throw]的不同是:

1.[Throw]可以用在任何位置,[Rethrow]只能用在[Catch<T>]

2.[Throw]使用时要为[Exception]指定一个基于[System.Exception ]的派生类,[Rethrow]则不用

 

很多时候,当异常捕获处理后,需要将异常再次抛出以便结束程序,这时可以使用[Rethrow],这样可以避免使用[Throw]时重新创建[Exception]

 

image.png

例:基本使用

1. 创建一code activity 名为[ExceptionActivity],在Execute中产生一段代码异常

 

 

code activity

ExceptionActivity

public sealed class ExceptionActivity : CodeActivity

{

protected override void Execute(CodeActivityContext context)

{

int v = 1 -1;

double i = 1 / v;

}

}

工作流

image.png

宿主

//==============================================================

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

}

 

static void aborted(WorkflowApplicationAbortedEventArgs e)

{

System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

}

 

static UnhandledExceptionAction unhandledException_Terminate(WorkflowApplicationUnhandledExceptionEventArgs e)

{

System.Console.WriteLine("unhandledException_Abort:{0}", e.UnhandledException.Message);

return UnhandledExceptionAction.Terminate;

}

 

//==============================================================

 

static void rethrowWorkflow()

{

WorkflowApplication instance = new WorkflowApplication(new RethrowWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

instance.OnUnhandledException = unhandledException_Terminate;

instance.Aborted = aborted;

 

instance.Run();

}

结果

image.png

 


TerminateWorkflow 结束流程


 

 

类名

System.Activities.Statements.TerminateWorkflow

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法]

[Exception]属性 的类型为[InArgument<System.Exception>]

[Reason]属性 的类型为[InArgument<string> ]

功能说明

[Reason]属性,异常信息.

要为[Exception]指定一个基于[System.Exception ]的派生类

image.png

 

当用[TerminateWorkflow]结束流程时,流程正常结束.会调用实例的[completed],但状态为[faulted]

 

image.png

例:基本使用

流程

image.png

宿主

#region //TerminateWorkflow例子

static void terminateWorkflow()

{

WorkflowApplication instance = new WorkflowApplication(new TerminateWorkflow());

 

instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(terminateWorkflowCompleted);

 

instance.Run();

}

 

static void terminateWorkflowCompleted(WorkflowApplicationCompletedEventArgs e)

{

System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

System.Console.WriteLine("Message:{0}", e.TerminationException.Message);

}

#endregion

结果

image.png

 

 

 



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864