문제

경험 부족을 드러내는 질문은 다음과 같습니다. 방법이 있습니다. dosomething () 깨끗하게 수행하지 않으면 예외가 발생합니다. 실패하면 덜 정확한 방법을 시도합니다. dosomething approximaticly () 충분히 좋은 해결책을 찾을 수 있기를 희망하는 여러 번; 이것이 실패하면 마침내 전화합니다 DOSOMTHETINACCUTEBUTGUARANTEDTOWORK (). 세 가지 모두이 객체에 속하는 방법입니다.

두 가지 질문 : 첫째, 이것은 (확실히 못생긴) 패턴이 허용됩니까, 아니면 더 우아한 방법이 있습니까?

둘째, 내가 몇 번이나 전화했는지 추적하는 가장 좋은 방법은 무엇입니까? dosomething approximaticly (), 그것이 예외를 던질 가능성이 높다는 것을 감안할 때? 나는 현재 객체에 가변적 인 inoofattempts를 유지하고 있으며, 둥지는 블록을 시도합니다 ... 이것은 끔찍하고 부끄럽습니다.

도움이 되었습니까?

해결책

응용 프로그램의 제어 흐름에 예외를 사용해서는 안됩니다.

당신의 경우 나는 세 가지 방법을 단일 방법으로 함께 모아서 어떤 접근법이 성공했는지, 아마도 열거 나 그와 비슷한 것을 반환하게한다.

다른 팁

예외를 던지는 대신 오류 코드를 반환하십시오.

이러한 방법이 실패하는 방법이 예외를 제외하고 동일한 방법으로 모두 잡아 카운터를 늘리고 오류 코드를 반환하는 것과 같은 적절한 조치를 취하십시오.

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

구조 경로에서 전체 기능 포인터를 이동하십시오. 단지 그것을 꾸미기 위해 큐와 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