异常处理。怎么扔一个迭代器?

时间:2016-12-09 07:43:08

标签: c++ exception-handling try-catch stdvector stdmap

我不太熟悉异常处理,所以有人可以帮我解决这个问题吗?所以对于这个程序,在std :: map中包含一个不存在的键,我想扔东西,但我不知道是什么。

地图密钥(如果存在)将是电话号码(字符串),但如果它不存在则会是什么?

{{1}}

2 个答案:

答案 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