2016-12-09 25 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