【问题标题】:Exception handling. How does one Throw an iterator?异常处理。如何抛出一个迭代器?
【发布时间】:2016-12-09 07:43:08
【问题描述】:

我对异常处理不太熟悉,所以有人可以帮我解决这个问题吗?所以对于这个程序,如果 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;
}

【问题讨论】:

  • iter的类型是什么?这就是你需要抓住的。对你来说这并不重要,因为它总是等于phone_map.end()。我建议你使用one of the standard exception classes,也许你可以根据一个标准类来制作自己的。
  • 另外供您参考:如果没有抛出异常,则使用异常对性能的影响可以忽略不计,但如果您抛出并捕获异常,则 C++ 中的异常确实会对性能产生相当大的影响。异常只能在异常的情况下使用。验证用户输入失败通常不是例外情况。
  • 我认为这是异常处理的一个坏例子。你根本不需要 try-catch 块。
  • 如果我的手指很粗并且输入了错误的电话号码怎么办?你会为这种情况抛出异常吗?正如前面的评论所指出的,人类输入错误不是例外情况。
  • 虽然这可以以更简单的方式完成,但我的作业规范告诉我这样做。我猜我的教授希望我习惯异常处理。老实说,我不知道何时使用它以及在这种情况下“例外情况”指的是什么。

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


【解决方案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
}

但不建议这样做。

【讨论】:

    【解决方案2】:

    我想说,在这种特殊情况下,您不需要抛出任何异常。从读者的角度来看,函数的Search 名称可能意味着该函数的唯一职责是检查地图中是否存在这样的元素。通过异常返回值是一种非常奇怪(且效率低下)的方式。在这里我会使用std::map::count - 如果地图中有这样的值,则返回1,否则返回0

    如果确实需要在值缺失的情况下抛出异常,请查看std::map::at()。如果密钥不存在,它会抛出 std::out_of_range 异常。

    有关std::map::at() 的更多信息以及从std::map 检索信息的其他方法,请参阅this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2015-09-26
      • 2013-07-24
      • 1970-01-01
      • 2023-03-07
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多