退一步代码 - 就像异常一样,但不是

时间:2009-06-09 00:41:56

标签: .net architecture class-design

我遇到了一种情况,我想在“树”上退回应用程序的方法,直到我决定抓住它(如果我这样做) - 就像一个例外;它通过所有代码提升,直到你抓住它或撞到屋顶。

一般的共识是你只对例外使用例外。在这种情况下,在代码中应用类似异常的机制是什么?但不一定是异常?

使用正确的机制是一个例外吗?在这种情况下,例外可以满足需要 - 但是通过严格的定义,它不是例外。

是否有我不知道的事件模式或类?

修改
只是为了澄清 - 我最初的设计是创建一个自定义异常 - 因为异常适合账单。但这不是一个例外 - 它是一个决定重新审视代码,直到我抓住它 - 取决于。我正在考虑自定义异常 - 但是要确保没有处理此问题的类/模式。

更新

我结束了抛出自定义异常。虽然我一直认为这是我想要的最好的模式/方法,但我并不喜欢使用异常 - 因为它不是例外。但最终,一个例外是完美的解决方案。

3 个答案:

答案 0 :(得分:2)

您正在寻找的设计模式称为延续,您将返回点作为值传递给其他函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Start();
        }

        void Start()
        {
            Console.WriteLine("Start");
            Step1(1);
            Console.WriteLine("End Start");
            Console.ReadKey(true);
        }

        void Step1(int state)
        {
            Console.WriteLine("Step1: {0}", state);
            Step2(2, () => {
                Console.WriteLine("Continuation from step1: {0}", state);
            });
            Console.WriteLine("End Step 1");
        }

        void Step2(int state, Action continuation)
        {
            Console.WriteLine("Step2: {0}", state);
            Step3(3, continuation);
            Console.WriteLine("End Step 2");
        }

        void Step3(int state, Action continuation)
        {
            Console.WriteLine("Step3: {0}", state);
            continuation();
            Console.WriteLine("End Step 3");
        }
    }
}

步骤3跳回到继续的第1步。该程序输出以下内容:

Start
Step1: 1
Step2: 2
Step3: 3
Continuation from step1: 1
End Step3
End Step2
End Step 1
End Start

延续传递风格非常强大,但在C#中并不是一个非常自然的习惯用语。小心使用。

答案 1 :(得分:0)

您可以派生自己的继承异常类然后抛出它,然后可以按照您自己的特定方式处理此特定异常。

答案 2 :(得分:0)

根据实际情况,GoF模式的响应模式链可能适合您的需求。 响应性链沿着一系列可能的处理程序转发任务,直到最终处理任务或链结束。