Как в c# правильно написать такой алгоритм?

try
{
//вариант 1
}
try
{
//если вариант 1 не удался, делать вариант 2
}
try
{
//если варианты 1 и 2 не удались , делать вариант 3
}
catch
{
//если никакой из вариантов не удался 
}

я думал сделать как-то так
try{
//вариант1
}
catch{
try{
//вариант2
}
catch{
try{
//вариант3
}
catch{
//если никакой из вариантов не удался 
}
}
}

но это ведь ... в общем подскажите, как можно сделать несколько подряд исключений. Спасибо
  • Вопрос задан
  • 2542 просмотра
Решения вопроса 1
@iamnothing
Если вы можете убрать эти exception, то может, действительно, переделать на if else?
if(method1()) {}
else if (method2()) {}
else if (method3()) {}
else {
    // выполняется при неудаче во всех случаях
}

а в методах method1, method2, method3, ... уже реализуете ваши варианты, и они возвращяют boolean
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер
В общем случае никак. Конечно можно соорудить примерно такой зоопарк:
void tries(params Func<Void> bodies) {
	try {
		bodies[0]();
	} catch {
		tries(bodies.Skip(1).ToArray());
	}
}

// using
tries( () => {
		// first try
	}, () => {
		// second try if first failed
	}, () => {
		// third try if second after first failed
	} ... )


Но @gleb_kudr и остальные правы - исключения далеко не лучший способ построения архитектуры приложения и уж точно он не должен быть использован для реализации алгоритма. Хотя исключения сегодня достаточно дёшевы (в C# по мелкомягкой политики мы и так платим за исключения даже не используя их), но алгоритм логичнее делать именно с помощью ветвлений, а не обработок исключений. Единственный use-case который я смог придумать - большое количество различных "одинаковых" ресурсов с различной степенью актуальностью - от сети до просьбы вставить диск. Как-то так. Но всё таки это экзотические ситуации и следует понимать, что исключения - всё таки исключительные ситуации и требоваться они должны редко. Если программа успешно (идеально) отработало, но было брошено сотни исключений - дело плохо.
Ответ написан
Комментировать
Terminaft
@Terminaft
Это что же вы пишите, раз существует возможность такой кучи исключений? Мне кажется, это все можно заменить обычными if'ами.
Ответ написан
Комментировать
@gleb_kudr
В общем случае "алгоритм на исключениях" является плохим паттерном с очень низкой производительностью. Нужно избегать возможного наличия "штатных" исключений.

Поэтому - делайте if'ами, как сказано в соседних ответах и используйте проверки на null (самый распространенный вариант вызова исключения - обращение к несуществующему объекту). Если вложенные куски большие - запаковывайте каждый из них в метод или функцию - будет проще читаться.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы