8

std::map (C++) メソッドを使用する場合や、boost::unordered_map メソッドなどを使用する場合に、例外的な状況を処理したいと考えています。ただし、メソッドのドキュメント (例: 挿入) を見ても、キャッチできる例外のリストはありません。

4

2 に答える 2

8

良いドキュメントを見てください: よくわからない場合は、最終的には標準ですが、たとえばhttp://en.cppreference.com/w/cpp/container/map/insertの方が便利で、ほとんどをカバーする例外の見出しがあります。バリアント (うまくいけば、いつか完成するでしょう)。ブースト サイトでオンラインに保持されているものよりも優れたブーストのドキュメントを見つけることはほとんどありません。

良いリファレンスが例外を文書化していない場合、それは通常、その関数のコードが例外をスローするように明示的に記述されていないためです。メモリ割り当ての影響、またはコピー構築や演算子などのオブジェクトに対する合理的な操作、または結果の構築中。それはすべて常識ですが。

規格の明示的な要件はstd::map...

23.2.4.1 例外の安全性の保証 [associative.reqmts.except]

1 連想コンテナーの場合、clear() 関数は例外をスローしません。コンテナーの Compare オブジェクト (存在する場合) によって例外がスローされない限り、erase(k) は例外をスローしません。

2 連想コンテナーの場合、単一の要素を挿入する insert() 関数内からの操作によって例外がスローされた場合、insert() 関数は効果がありません。

3 連想コンテナーの場合、コンテナーの Compare オブジェクト (存在する場合) のスワップによって例外がスローされない限り、swap 関数は例外をスローしません。


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 に答える