WF4.0 Beta1 异常处理
目录
1.3 OnUnhandledException 的处理方式 2
1.3.1 UnhandledExceptionAction.Cancel 2
1.3.2 UnhandledExceptionAction.Abort 3
1.3.3 UnhandledExceptionAction.Terminate 4
1.4 TryCatch 与 Catch<T> 异常捕获 5
产生异常
WF的异常可由以下两种方式产生
1.使用[Throw Activity] 抛出异常,
使用[Throw]抛出异常,不会使宿主崩溃,异常可被实例的[OnUnhandledException]方法捕获
2.由[Activity]中的代码运行错误产生异常
public class myActivity : CodeActivity { protected override void Execute(CodeActivityContext context) { int v = 1 - 1; double i = 1 / v; } } |
代码运行错误产生异常,不会使宿主崩溃,异常可被实例的[OnUnhandledException]方法捕获
Throw
类名:System.Activities.Statements.Throw
基类:CodeActivity
文件: System.Activities.dll
类型:sealed
说明: 1.工作流中的引发异常,不会使宿主崩溃
2.如果使用VS调试,不会在[Throw]处断住,
3.异常可被实例的[OnUnhandledException]方法捕获
4.[Throw] 的 [Exception 属性] 用于指定要抛出的异常
public class myException : System.Exception { public myException(string ms):base(ms) { } } |
class Program { static void Main(string[] args) { WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());
myInstance.OnCompleted = completed;
myInstance.OnUnhandledException = unhandledException;
myInstance.OnAborted = aborted;
myInstance.Run();
System.Console.Read();
} static void completed(WorkflowCompletedEventArgs e) { System.Console.WriteLine("completed"); }
static void aborted(WorkflowAbortedEventArgs e) { System.Console.WriteLine("aborted",e.Reason.Message); }
static UnhandledExceptionAction unhandledException(WorkflowUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException{0}",e.UnhandledException.Message);
// return UnhandledExceptionAction.Terminate;
//return UnhandledExceptionAction.Cancel;
return UnhandledExceptionAction.Abort; } } |
OnUnhandledException 的处理方式
WF的异常可以被实例的OnUnhandledException处理.
OnUnhandledException的处理结果的以下三种
UnhandledExceptionAction.Cancel
1.如果异常出现在[CancellationScope 取消容器]中,当[UnhandledExceptionAction]方法的返回值为[Cancel]时,会调用[CancellationScope]的[CancelHandler]部分
2.完成[CancelHandler]部分后,流程结束.会调用实例的[OnCompleted ]
3.对[Throw Activity]与[代码运行错误]都有效
自定义异常 | public class myException : System.Exception { public myException(string ms):base(ms) { } } |
流程 | |
宿主 | class Program { static void Main(string[] args) { WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());
myInstance.OnCompleted = completed;
myInstance.OnUnhandledException = unhandledException;
myInstance.OnAborted = aborted;
myInstance.Run();
System.Console.Read();
} static void completed(WorkflowCompletedEventArgs e) { System.Console.WriteLine("completed"); }
static void aborted(WorkflowAbortedEventArgs e) { System.Console.WriteLine("aborted",e.Reason.Message); }
static UnhandledExceptionAction unhandledException(WorkflowUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException{0}",e.UnhandledException.Message);
return UnhandledExceptionAction.Cancel; } } |
结果 |
UnhandledExceptionAction.Abort
1.当[UnhandledExceptionAction]方法的返回值为[Abort]时,流程终止.会调用实例的[OnAborted]
2.对[Throw Activity]与[代码运行错误]都有效
class Program { static void Main(string[] args) { WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());
myInstance.OnCompleted = completed;
myInstance.OnUnhandledException = unhandledException;
myInstance.OnAborted = aborted;
myInstance.Run();
System.Console.Read();
} static void completed(WorkflowCompletedEventArgs e) { System.Console.WriteLine("completed"); }
static void aborted(WorkflowAbortedEventArgs e) { System.Console.WriteLine("aborted",e.Reason.Message); }
static UnhandledExceptionAction unhandledException(WorkflowUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException{0}",e.UnhandledException.Message);
return UnhandledExceptionAction.Abort; } } |
UnhandledExceptionAction.Terminate
1.当[UnhandledExceptionAction]方法的返回值为[Terminate]时,流程结束.会调用实例的[completed]
2.对[Throw Activity]与[代码运行错误]都有效
class Program { static void Main(string[] args) { WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());
myInstance.OnCompleted = completed;
myInstance.OnUnhandledException = unhandledException;
myInstance.OnAborted = aborted;
myInstance.Run();
System.Console.Read();
} static void completed(WorkflowCompletedEventArgs e) { System.Console.WriteLine("completed"); }
static void aborted(WorkflowAbortedEventArgs e) { System.Console.WriteLine("aborted",e.Reason.Message); }
static UnhandledExceptionAction unhandledException(WorkflowUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException{0}",e.UnhandledException.Message);
return UnhandledExceptionAction.Terminate;
} } |
TryCatch 与 Catch<T> 异常捕获
对[Throw Activity]与[代码运行错误]都有效
如果异常被捕获,就不会被抛出,流程会继续向下执行
TryCatch
类名:System.Activities.Statements.TryCatch
基类:NativeActivity
文件: System.Activities.dll
类型:sealed
说明: 1. [TryCatch] 类似于 C# 中的 Try catch 构造, 执行 Try 块中出现异常时将执行与该异常最匹配的 Catch 块 ,找到不匹配的 catch 时会将捕获的异常继续抛出,工作流将被终止
2. [TryCatch] 有一个 [Try],用于放置要执行的[Activity]
3. [TryCatch] 有一个 [Catches],用于放置捕获异常的[Catch<T>],如果 [TryCatch]中没的[Catch<T>],异常将会被直接抛出
3. [TryCatch] 有一个 [Finally] 块在 [Try] ,[Catchs]完成后执行。无论是否有异常,都会执行 [Finally]
Catch<T>
类名:System.Activities.Statements.Catch<T>
基类:Catch:object
文件: System.Activities.dll
类型:sealed
说明: 1. [Catch<T>] 只能在 [TryCatch] 内部的[Catches]中使用
2.[Catch<T>] 表示要在[ TryCatch ]中使用的一个 catch 块。
3.如果在执行[Try] 块中出现异常时,[TryCatch] 会查找匹配的[ Catch]的异常的类型。
4.使用[Catch<T>]时,要指定要用其捕获的异常类型,可以使用[System.Exception]捕获所有异常
例
自定义异常 | public class myException : System.Exception { public myException(string ms):base(ms) { } } |
流程 | |
宿主 | class Program { static void Main(string[] args) { WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());
myInstance.OnCompleted = completed;
myInstance.OnUnhandledException = unhandledException;
myInstance.OnAborted = aborted;
myInstance.Run();
System.Console.Read();
} static void completed(WorkflowCompletedEventArgs e) { System.Console.WriteLine("completed"); }
static void aborted(WorkflowAbortedEventArgs e) { System.Console.WriteLine("aborted",e.Reason.Message); }
static UnhandledExceptionAction unhandledException(WorkflowUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException{0}",e.UnhandledException.Message);
return UnhandledExceptionAction.Abort; } } |
结果 | |
没有异常的结果 |