Шаг назад через код - как исключение, но не - PullRequest
0 голосов
/ 09 июня 2009

Я столкнулся с ситуацией, когда я хотел бы шагнуть назад по методам приложения вверх по «дереву», пока не решил поймать его (если я это сделаю) - как исключение; он поднимается по всему коду, пока вы его не поймаете или не достигнете крыши.

Общее мнение заключается в том, что вы используете исключения только для исключений. В таком случае, каков будет механизм применения исключения, например шаблона, в коде, но не обязательно исключения?

Является ли исключение правильным механизмом для использования? В этом случае исключение делает то, что нужно, но по строгому определению это не исключение.

Есть ли шаблон событий или класс, о котором я не знаю?

Редактировать
Просто чтобы уточнить - мой первоначальный дизайн должен был создать пользовательское исключение - так как исключение отвечает всем требованиям. Но это не исключение - это решение вернуться к коду, пока я его не уловил или нет - в зависимости. Я думаю о нестандартном исключении - но хочу убедиться, что нет класса / шаблона, который бы это обрабатывал.

Обновление

Я закончил выдавать пользовательское исключение. Хотя я всегда думал, что это лучший шаблон / метод для того, что я хотел, мне не понравилось использование исключения для этого - так как это не исключение. Но в конечном итоге исключением является идеальное решение.

Ответы [ 3 ]

2 голосов
/ 09 июня 2009

Шаблон проектирования, который вы ищете, называется продолжением, где вы передаете точку возврата в качестве значения другим функциям:

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 #. Используйте с осторожностью.

0 голосов
/ 09 июня 2009

В зависимости от реального сценария цепочка ответственности шаблона GoF может соответствовать вашим потребностям. Цепочка ответственности направляет задачу по цепочке возможных обработчиков, пока одна из них не выполнит задачу или цепочка не закончится.

0 голосов
/ 09 июня 2009

Вы можете получить свой собственный унаследованный класс исключений и затем выдать его, тогда это конкретное исключение можно будет обрабатывать по-своему.

...