WF4.0 Beta1 异常处理

WF4.0 Beta1 异常处理

目录

1    WF4.0 Beta1 异常处理    1

1.1    产生异常    1

1.2    Throw    1

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

1.4.1    TryCatch    5

1.4.2    Catch<T>    6

1.4.3    例    6

 

 

产生异常

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;

}

}

结果

没有异常的结果

 

posted @ 2009-07-05 10:10  WXWinter(冬)  阅读(1342)  评论(2编辑  收藏  举报