Прерывание работы вложенной функции в цикле

#c#

#c#

Вопрос:

Я довольно новичок в C # и только что «окопался». Я получил свое первое простое служебное приложение, которое работает хорошо, но у меня проблема, когда оно выдает ошибку.

Прямо сейчас у меня есть две функции, одна зацикленная.

 Main(){Foo(){loop{foo2()
  

Большинство элементов в foo2 являются локальными для foo2, поэтому в случае сбоя он просто возвращается и работает со следующим элементом, ничего страшного. Но когда возникает ошибка, которая влияет на все, я хочу в основном выполнить возврат дважды или в основном вызвать messagebox и прекратить выполнение текущего foo2() и заключить foo().

Как мне это сделать, чтобы foo не выполнял цикл и, таким образом, не выдавал сообщение об ошибке при всех оставшихся запусках foo2()

Комментарии:

1. Вы можете просто return из метода, после проверки условия. Трудно сказать, как именно это сделать, не могли бы вы предоставить use больше контекста?

2. Я думал о создании переменной, которая отслеживает «сбой», а функция foo() проверяет ее и возвращает, если она установлена. Это лучший способ сделать это? Возможно, foo2() сталкивается с условием, которое не выполняется на всех итерациях цикла, поэтому прямо сейчас, поскольку мой messagebox / return находится в foo2(), он покажет диалоговое окно ошибки 5-200 раз, в зависимости от того, сколько раз вы выполняете цикл. Я знаю, что могу создать флаг, который я просматриваю при вызове foo2, и если он установлен, просто остановить, но не знал, есть ли более чистый способ сделать это.

3. Я думаю, что лучшее решение действительно будет зависеть от того, каковы фактические методы и что они делают, и какой именно тип ошибки вы хотите разрешить и запретить. Было бы полезно опубликовать ваш код.

4. foo() в основном просто содержит цикл, вызывающий foo2(), foo2() создает stringbuilder на основе множества входных данных и логики, а затем записывает его в файл. Но прежде чем записать ее в файл, он проверяет синтаксис и убеждается, что он правильный. Если синтаксис завершается ошибкой, он выдает messagebox и «возвращает», но это возвращает его обратно в цикл, который снова завершится ошибкой, поскольку входные данные имеют неправильный синтаксис. Мне нужно, чтобы функция foo2() могла возвращаться до цикла, в котором она вызывается.

Ответ №1:

Если это «ошибка», то, возможно, выбрасывание (и перехват) исключения является опцией, т. е.

 try {
   // lots
     // of 
        // loops
            throw new InvalidOperationException("oops");
} catch (Exception ex) {
    MessageBox.Show(ex.Message);
}
  

обратите внимание, что на самом деле ваш код пользовательского интерфейса (окно сообщения) и фактический код лучше всего разделить.

Другой вариант — просто использовать return or return [some value] для выхода из подметодов в нужный вам момент, т.Е.

 string message = TryAndDoSomething();
if(!string.IsNullOrEmpty(message)) MessageBox.Show(message);
...
string TryAndDoSomething() {
   // lots
       // of
           // loops
                 return "oops";
    ...
   return null; // all ok
}
  

Ответ №2:

Я не уверен, понимаю ли я ваш сценарий, поэтому дайте мне знать, если это решит вашу проблему. Простите за синтаксис.

 foo()
    {
      if(error-that-effects-everything)
        {
           return 0;
        }
      else if(error-that-doesn't)
        {
           return 1; 
        }
      else{}
    }

    bar()
    {
       retval = null;
       while(retval != 0)
       {
         retval = foo();
       }

    }

    Main()
    {
      bar();
    }