#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();
}