Шаблон для использования различных методов при возникновении исключения

StackOverflow https://stackoverflow.com/questions/126829

Вопрос

Вот вопрос, демонстрирующий мою неопытность:у меня есть метод Сделай что-нибудь() который выдает исключение, если ему не удается сделать это чисто.Если не получится, попробую менее точный метод. Сделайте что-нибудь примерно() несколько раз в надежде, что найдется достаточно хорошее решение;если и это не поможет, я наконец позвоню Выполните что-тонеаккуратно, но гарантировано для работы ().Все три являются методами, принадлежащими этому объекту.

Два вопроса:во-первых, приемлем ли этот (по общему признанию, уродливый) шаблон или есть более элегантный способ?

Во-вторых, как лучше всего отслеживать, сколько раз я звонил? Сделайте что-нибудь примерно(), учитывая, что это может вызвать исключение?В настоящее время я храню переменную iNoOfAttempts в объекте и вставляю блоки попыток...это ужасно и мне стыдно.

Это было полезно?

Решение

Никогда не следует использовать исключения для управления потоком вашего приложения.

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

Другие советы

Возвращайте код ошибки вместо выдачи исключения.

Если из-за сбоя этих методов возникают исключения, перехватите их все в одном методе и предпримите соответствующие действия, например увеличение счетчика и возврат кода ошибки.

   bool result = DoSomething();
   while (!result && tries < MAX_TRIES) {
       result = DoSomethingApproximately(); //This will increment tries
       if (tries > THRESHOLD) {
           result = DoSomethingThatAlwaysWorks();
       }
   }

Пройдите все указатели функций по маршруту структуры.Чтобы придать остроты, я буду использовать Queue и немного LINQ.

Queue<Action> actions = new Queue<Action>(new Action[] {
   obj.DoSomething,
   obj.DoSomethingApproximately,
   obj.DoSomethingApproximately,
   obj.DoSomethingApproximately,
   obj.DoSomethingApproximately,
   obj.DoSomethingGuaranteed
});

actions.First(a => {
   try {
      a();
      return true;
   } catch (Exception) {
      return false;
   }
});

Как насчет (псевдокод):

try{ return doSomething(); }
catch(ExpectedException) { ...not much here probably...}

for(i = 0 to RETRIES){
try{ return doSomethingApproximately; }
catch(ExpectedException) { ...not much here probably...}
}

doSomethingGuaranteed();

Приложение:

Я настоятельно рекомендую вам не использовать специальные возвращаемые значения, поскольку это означает, что каждый пользователь функции должен знать, что некоторые возвращаемые значения являются особенными.В зависимости от диапазона функции может быть разумно вернуть обычную часть диапазона, с которой можно нормально работать, напримерпустая коллекция.Конечно, это может сделать невозможным отличить неудачу от «правильного» ответа — пустой коллекции (в этом примере).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top