我如何找出std :: map方法可以抛出哪些异常?

时间:2013-06-26 06:04:03

标签: c++ map

我想在使用std :: map(C ++)方法时以及使用boost :: unordered_map方法之类的时候处理异常情况。但是,查看方法文档(例如:insert)并未提供我可以捕获的异常列表。

2 个答案:

答案 0 :(得分:6)

查看好的文档:如果您当时不确定 - 最终 - 标准,但是http://en.cppreference.com/w/cpp/container/map/insert可能更方便,并且有一个Exceptions标题涵盖大多数变体(希望有一天会完成)。你不太可能找到更好的提升文档,而不是在提升网站上保存的文件。

如果一个好的引用没有记录异常,通常是因为该函数的代码没有显式写入以抛出任何内容 - 尽管这并不意味着在准备函数的参数时不会抛出异常,作为内存分配的副作用或对对象的一些合理操作,例如复制建筑或操作员,或在构造结果期间。所有这些都是常识。

标准的明确要求是std::map ...

  

23.2.4.1异常安全保证[associative.reqmts.except]

     

1对于关联容器,没有clear()函数抛出异常。 erase(k)不会抛出异常   除非容器的Compare对象(如果有)抛出该异常。

     

2对于关联容器,如果insert()函数中的任何操作抛出异常   插入单个元素时,insert()函数无效。

     

3对于关联容器,除非抛出异常,否则交换函数不会抛出异常   交换容器的Compare对象(如果有的话)。


  

23.4.4.3地图元素访问[map.access]

     

T&安培; at(const key_type& x);

     

const T& at(const key_type& x)const;

     

10抛出:如果不存在这样的元素,则为out_of_range类型的异常对象。

答案 1 :(得分:2)

Jorge,

标准容器只能在访问时抛出out-of-range例外,不会在其他操作上抛出异常。但是,当此操作重载时,包含的项可以引入内部操作(构造函数,赋值,比较)。这就是@ tony-d链接给出最佳答案的原因:这记录了在操作期间(插入/清除/交换)某些底层元素引发时容器的行为。

唯一可以引发的例外是内存访问冲突和内存不足错误,如果有的话,你应该在每个高级别处理全局(并且非常小心)。