2009-09-30 3 views
0

은 특정 시간 동안 특정 종류의 대기열과 블록을 폴링하는 기능이 있다고 가정합니다. 이 시간이 대기열에 표시되지 않고 경과 된 경우 발신자에게 시간 초과 표시가 전달되어야합니다. 그렇지 않으면 표시되는 무언가가 반환되어야합니다.객체 지향 환경에서 자주 발생하는 오류를 반환하는 방법은 무엇입니까?

지금 당신은 같은 것을 쓸 수있다 :

class Queue 
{ 
    Thing GetThing(); 
} 

및 타임 아웃의 경우에 예외를 throw합니다. 또는 당신은

class Queue 
{ 
    int GetThing(Thing& t); 
} 

를 작성하고 성공과 시간 제한에 대한 오류 코드를 반환 .

그러나 솔루션 1의 단점은 너무 바쁜 대기열 시간 초과가 예외적 인 경우가 아니라 오히려 공통적이라는 것입니다. 그리고 솔루션 2는 아무런 내용도 담고 있지 않은 Thing으로 끝날 수 있기 때문에 오류와 추악한 구문에 대해 반환 값을 사용합니다.

이 문제에 대한 또 다른 (현명한) 해결책이 있습니까? 객체 지향 환경에서 선호되는 솔루션은 무엇입니까?

답변

0
오류가 정지 응용 프로그램의 실행 충분히 심각한, 또는 BIG-의 경우에만 나는 예외를 사용하는 것이

충분한 응용 프로그램의 구성 요소. 하지만 일반적인 경우에는 예외를 사용하지 않을 것이며, 그 후에는 정상적인 실행을 계속하거나 동일한 기능을 다시 실행합니다. 이것은 흐름 제어에 대한 예외를 사용하는 것일뿐입니다. 대신 string에, 당신은 오류 코드에 대한 int을 고수 할 수 물론

class Queue 
{ 
    bool GetThing(Thing& t); // true on success, false on failure 
    string GetLastError(); 
}; 

: 그래서

, 나는 당신이 제안하는 두 번째 솔루션을 사용하거나, 다음을 수행하는 것이 좋습니다 전체 오류 메시지 또는 더 나은 것은 그냥 class Error으로 정의하고 GetLastError()을 반환하십시오.

0

첫 번째 해결 방법에서 nullGetThing에서 돌려 보내서 Thing *을 반환하는 이유는 무엇입니까? 적어도 지금까지 제공해 주신 정보에 따르면이 법안에 맞는 것 같습니다.

0

첫 번째 및 두 번째 경우에는 아무 것도 할 수 없습니다. 하지만 예외를 throw합니다. Thing 또는 Thing &을 반환하면 Thing을 반환하지 않을 수 없습니다. 당신이 다음 예외를 사용하지 않고 실패 할 경우

이 필요합니다

class Queue 
{ 
    // Either something like this. GetThing retuns NULL on an error, 
    // GetError returns a specific error code 
    Thing* GetThing(); 
    int GetError(); 
    // This kind of pattern is common. Return a result code 
    // and set ppOut to a valid thing or NULL. 
    int GetThing(Thing** ppOut); 
}; 
+0

Thing이 값 또는 ID 의미를 가졌는지 여부에 달려있다. - Thing이 std :: string 또는 int 인 경우, 값에 대한 참조를 변경하면 스트림에서 읽기가 EOF에 도달 할 때 수행하는 작업과 정확히 일치하지 않는다. –

관련 문제