2016-12-09 10 views
0

예외 처리에 익숙하지 않아서 누군가이 문제를 해결할 수 있습니까 ?? 그래서이 프로그램에 대해 std :: map에 존재하지 않는 키를 넣으면 나는 무언가를 던지고 싶습니다. 그러나 무엇을 모르겠습니다.예외 처리. 어떻게 반복자를 던지나요?

지도 키가있는 경우 전화 번호 (문자열)가되지만 존재하지 않으면 무엇이 될까요 ??

class SmartCarrier{ 
private: 
    string carrier_name_; 
    map<string,vector<Message*>> accounts_map; 
public: 
    Search(); 
} 

void phone::Search{ 

    string phone_number; 


    map<string,vector<Message*>>::iterator iter; 


    cout << "Enter a phone number: "; 
    getline(cin,phone_number); 

try{ 
    iter = phone_map.find(phone_number); 

    if (iter ==phone_map.end()) { 
     //Incase of a non-existing phone number what do I throw? 
     throw iter; 
    } 

} 
catch(/*iter ??? what should the block catch as a value?*/){ 
    cout << "Phone number not found." << endl; 
} 
+0

'iter'의 유형은 무엇입니까? 그것이 당신이 알아야 할 것입니다. 그것은 항상'phone_map.end()'와 동등 할 것이기 때문에 당신의 경우에는별로 중요하지 않다. 아마도 [표준 예외 클래스 중 하나] (http://en.cppreference.com/w/cpp/error)를 사용하여 표준 클래스를 기반으로 자신 만의 클래스를 만들 것을 제안합니다. –

+0

또한 알아두기 : 예외를 사용하는 것은 예외가 발생하지 않으면 성능에 무시할 수있는 영향을 미치지 만 C++의 예외는 throw하고 catch하는 경우 성능에 상당한 영향을 미칩니다. 예외는 * 예외적 인 경우에만 사용해야합니다. 일반적으로 사용자 입력의 유효성을 검증하지 않는 것은 예외적 인 경우는 아닙니다. –

+0

이것이 예외 처리의 나쁜 예라고 생각합니다. 여기에 try-catch 블록이 전혀 필요하지 않습니다. –

답변

1

엄지 손가락의 규칙 - 어떤 스타일 가이드에 의해 달리 명시되지 않은 경우 당신은 항상, std::exception의 파생 클래스를 던져. std::runtime_error과 같이 이미 정의 된 공통 예외를 사용할 수 있습니다. 그리고 오류 데이터를 예외 인수로 전달합니다. 예외의 전체적인 부분입니다. 오류 데이터를 전파하십시오.

항상 const-reference를 잡아라. 귀하의 경우에는

당신은 간단하게 할 수 있습니다

try { 
    auto iter = phone_map.find(phone_number); 
    if (iter == phone_map.end()) { 
     throw std::runtime_error{ "Incorrect phone number" }; 
    } 
} catch(const std::exception& e){ 
    cout << e.what() << endl; 
} 

는 귀하의 경우에 당신은 반복자를 던질 수 있으며, 다음과 같이 잡아 :

try { 
    throw phone_map.end(); 
} catch (const map<string,vector<Message*>>::iterator& e) { 
    // Do Something 
} 

을하지만,이 방법은 추천하지 않습니다.

0

이 특별한 상황에서는 예외를 throw 할 필요가 없다고 말하고 싶습니다. 독자의 관점에서 함수의 이름 인 Search은 아마도 함수의 유일한 책임은지도에 이러한 요소가 있는지 여부를 확인하는 것입니다. 예외로 값을 반환하는 것은 매우 이상하고 비효율적 인 방법입니다. 여기에 std::map::count을 사용할 것입니다.이 값이지도에 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다.

가치가 불완전한 경우 예외를 던질 필요가 있다면 std::map::at()을보십시오. 키가 없으면 std::out_of_range 예외가 발생합니다.

std::map::at()에 대한 자세한 정보 및 std::map의 다른 검색 정보는 this을 참조하십시오.