• 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;

    }

    }

    结果

    没有异常的结果

     

  • 相关阅读:
    appium 多线程还是多进程(转)
    清理不可用的模拟器
    ios-元素查看器安装
    Linux 一条命令杀死占用端口的所有进程
    appium 小程序自动化测试
    (转)MitmProxy+APPnium安装使用
    mysql死锁分析
    母线故障跳闸的处理方法(转载)
    电动葫芦使用注意事项(转载)
    三菱plc输出指示灯不亮怎么办(转载)
  • 原文地址:https://www.cnblogs.com/foundation/p/1517077.html
Copyright © 2020-2023  润新知