8

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

4

2 回答 2

8

查看好的文档:如果您不确定然后 - 最终 - 标准,但例如http://en.cppreference.com/w/cpp/container/map/insert可能更方便,并且有一个 Exceptions 标题涵盖大多数变体(希望有一天会完成)。您不可能找到比在 boost 站点上在线保存的文档更好的 boost 文档。

如果一个好的参考没有记录异常,那通常是因为该函数的代码没有明确编写为抛出任何异常——尽管这并不意味着在准备函数的参数时不会抛出异常,作为一个方面内存分配或对对象的一些合理操作的影响,例如复制构造或运算符,或在构造结果期间。不过,这都是常识。

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

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

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

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

3 对于关联容器,没有交换函数会引发异常,除非该异常是由容器的比较对象(如果有)的交换引发的。


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

T& at(const key_type& x);

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

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

于 2013-06-26T06:15:03.973 回答
3

乔治,

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

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

于 2013-06-26T11:18:09.950 回答