Выполните несколько функций, но остановитесь, когда произошла ошибка - PullRequest
0 голосов
/ 05 марта 2020

Я хочу использовать несколько функций друг за другом, но если что-то пошло не так в первой функции, другие функции не должны выполняться. В данный момент я использую какое-то время l oop с переключателем. Есть ли способ пропустить целое время / переключить часть с чем-то еще? Может быть, что-то похожее на событие?

while (!ErrorActive && iStep != 3)
{
    switch (iStep)
    {
        case 0:
            DoSomething(); // this can trigger ErrorActive
            iStep = 1;
            break;

        case 1:
            DoSomething2(); // this can trigger ErrorActive
            iStep = 2;
            break;

        case 2:
            DoSomething3(); // this can trigger ErrorActive
            iStep = 3;
            break;
    }
}

функции DoSomething имеют что-то вроде этого:

public void DoSomething()
{
    try
    {
        //calculate something
    }
    catch
    {
        ErrorActive = true;
    }
}

Есть ли способ пропустить целую часть while / switch и заменить ее чем-то другим? (может быть, как событие?) или я должен всегда держать что-то между каждой функцией, чтобы проверить, все ли в порядке?

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Просто переместите улов на один уровень вверх:

// true if all steps executed, false otherwise
bool DoSteps()
{
   int lastExecutedStep = 0;
   try{
     DoSomething();
     lastExecutedStep = 1;
     DoSomething1();
     lastExecutedStep = 2;
     DoSomething2();
     lastExecutedStep = 3;
   }
   catch( IOException ioex )
   {
      // log IO Exception
   }
   // ... catch more expected exception types

   return (lastExecutedStep == 3);
}

void DoSomething(){
   // NO try/catch here
}

Даже возможно без счетчика шагов:

// true if all steps executed, false otherwise
bool DoSteps()
{
   try{
     DoSomething();
     DoSomething1();
     DoSomething2();
     return true;
   }
   catch( IOException ioex )
   {
      // log IO Exception
   }
   // ... catch more expected exception types

   return false;
}

Для более академического подхода вы можете захотеть изучить Цепочка ответственности рисунок

0 голосов
/ 05 марта 2020

Вы можете упростить while l oop до for l oop и использовать новый синтаксис выражения switch, чтобы немного упростить ситуацию. Кроме того, пусть функции возвращают состояние успеха, а не устанавливают некоторую общую переменную:

void Run()
{
    var keepRunning = true;

    for(int i = 0; keepRunning; i++)
    {
        keepRunning = i switch
        {
            0 => DoSomething(),
            1 => DoSomething2(),
            2 => DoSomething3(),
            _ => false
        };
    }
}

bool DoSomething()
{
    try
    {
        return true;
    }
    catch
    {
        return false;
    }
}

bool DoSomething2()
{
    try
    {
        return true;
    }
    catch
    {
        return false;
    }
}

bool DoSomething3()
{
    try
    {
        return true;
    }
    catch
    {
        return false;
    }
}
0 голосов
/ 05 марта 2020

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

if(!ErrorActive){
 DoSomething(); // this can trigger ErrorActive
}

if(!ErrorActive){
 DoSomething1(); // this can trigger ErrorActive
}

if(!ErrorActive){
 DoSomething2(); // this can trigger ErrorActive
}
...