我不太熟悉异常处理,所以有人可以帮我解决这个问题吗?所以对于这个程序,在std :: map中包含一个不存在的键,我想扔东西,但我不知道是什么。
地图密钥(如果存在)将是电话号码(字符串),但如果它不存在则会是什么?
{{1}}
答案 0 :(得分: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
}
但不建议这样做。
答案 1 :(得分:0)
我会说在这种特殊情况下你不需要抛出任何异常。从读者的角度来看,函数的Search
名称可能意味着函数的唯一责任是检查映射中是否存在这样的元素。通过异常返回值是一种非常奇怪(且效率低下)的方式。在这里,我会使用std::map::count
- 如果此值在地图中,则返回1
,否则返回0
。
如果你真的需要在有价值的情况下抛出异常,请看std::map::at()
。如果密钥不存在,它会抛出std::out_of_range
异常。
有关std::map::at()
的更多信息以及std::map
的其他检索信息方法,请参阅this。