std::map (C++) メソッドを使用する場合や、boost::unordered_map メソッドなどを使用する場合に、例外的な状況を処理したいと考えています。ただし、メソッドのドキュメント (例: 挿入) を見ても、キャッチできる例外のリストはありません。
2 に答える
良いドキュメントを見てください: よくわからない場合は、最終的には標準ですが、たとえば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 型の例外オブジェクト (そのような要素が存在しない場合)。
ホルヘ、
標準コンテナーはout-of-range
、アクセス時にのみ例外をスローできます。他の操作では例外をスローしません。ただし、内部操作 (コンストラクター、代入、比較) がオーバーロードされている場合、含まれている項目がこの操作をスローする可能性があります。そのため、@tony-d リンクが最良の回答を提供します。これは、操作 (挿入/クリア/スワップ) 中に基になる要素が発生したときのコンテナーの動作を文書化したものです。
発生する可能性のある唯一の例外は、メモリ アクセス違反とメモリ不足エラーです。これらは、すべての高レベルでグローバルに (そして非常に慎重に) 処理する必要があります。