2016-12-09 36 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++中的異常確實會對性能產生相當大的影響。例外情況只應用於*特殊*情況。未能驗證用戶輸入通常不是這種特殊情況。 –

+0

我認爲這是異常處理的一個壞例子。你根本不需要try-catch塊。 –

回答

1

經驗法則 - 你總是拋出的std::exception派生類中,如果不通過一些風格指南另有說明。您可以使用已定義的常見例外,例如std::runtime_error。並將錯誤數據作爲異常參數傳遞,這就是異常點 - 傳播錯誤數據。

總是被const引用捕獲。

你的情況,你可以簡單地做:

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

我想說,在這種特殊情況下,你不需要拋出任何異常。從讀者的角度來看,函數的名字可能意味着該函數的唯一職責是檢查地圖中是否存在這樣的元素。通過異常返回值是一種非常奇怪(且效率低下)的方式。在這裏,我將使用std::map::count - 如果此值在地圖中則返回1,否則返回0

如果您確實需要在有價值的情況下拋出異常,請查看std::map::at()。如果密鑰不存在,它將引發std::out_of_range異常。

欲瞭解更多有關std::map::at()和其他檢索信息的方法從std::map請參閱this

相關問題