【问题标题】:C++ capture error "throwing an instance of 'std::out_of_range'" [duplicate]C ++捕获错误“抛出'std :: out_of_range'的实例” [重复]
【发布时间】:2021-10-14 17:42:08
【问题描述】:

这将是我在这里的第一个问题。我遇到了一个我想在我正在处理的程序中解决的问题(执行一些实习生/开发人员跟踪任务)。

我有一个 std::map 数据结构。每次我从 cmd 行传递一个未映射的值时,我都会得到: 在抛出 'std::out_of_range' 的实例后调用终止 什么():地图::在 中止(核心转储)

没关系,这就是它应该的方式。 但是,我想要实现的是验证用户输入,如果地图中不存在该值,则例如在变量中捕获上述事件,然后将其打印出来。

我尝试的每个条件语句都没有按我的意愿工作,因为它会立即抛出“终止调用...”广告,从而关闭整个程序。

【问题讨论】:

标签: c++


【解决方案1】:

您应该将您的 std::map::at(key) 呼叫包围在 try/catch 块内,如

std::map<std::string, int> my_map = {{"one",1}, {"two":2}};

try
 { 
  auto val = my_map.at("three");
  std::cout << "my value at 'three' is " << val << "\n"; 
 } 
catch(std::out_of_range const & e)
 { 
  std::cerr << "oops 'three' is not in your map\n";
 }

【讨论】:

    【解决方案2】:

    您可以使用 try-catch 块捕获错误,但您可以轻松避免一开始就抛出它。

    c++20可以使用std::map.contains(key_type)查看是否在地图中。

    没有c++20,你可以使用std::map.find(key_type),然后断言它不等于std::map.end()

    例子:

    std::map<int,int> a = {{1, 5}, {2, 3}};
    if(a.contains(3))
        // Do something
    else
        // Do something else
    
    auto it = a.find(2)
    if(it != a.end()) // Meaning that value was found
        // Do something
    else
        // Do something else 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2017-03-08
      • 2021-06-04
      相关资源
      最近更新 更多