例外処理に関する私の理解は非常に限られています。例外をスローするのは簡単だと思いますが (またはexpected<T>
後で使用するためにパックすることもできます)、例外をどうするかについてはほとんどわかりません。
現在、私の知識は限られています
自分のリソースをクリーンアップし、適切な場所で処理されるように例外を再スローします。例えば
ptr p = alloc.allocate(n); try { uninitialized_copy(first,last,p);//atomic granularity, all or none } catch(...) { alloc.deallocate(p,n); throw; }
RAII
しかし、これは次のようなパターンで同等に変換できると思います
alloc_guard<ptr> p{alloc.allocate(n)};
uninitialized_copy(first,last,p.get());
p.commit();
トップレベルで例外をキャッチし、素敵なメッセージを作成して出力し、終了します.eg
int main(int argc,char** argv) { try { app_t the_app(argc,argv); the_app.run(); } catch(std::runtime_error& e) { //instead of what, I can also compose the mesage here based on locale. std::cout<<e.what()<<std::endl; } }
main
したがって、例外をキャッチし、適切なメッセージを出力して閉じるなどのトップレベル関数で行うだけです。
さまざまな外部ライブラリを実装のバックエンドとして使用して、優れた API セットを備えたライブラリを実装しているときに、サードパーティ ライブラリの例外が API 仕様の一部であることに気付きました。サード パーティのライブラリの例外は、ライブラリの境界を越えてユーザー コードに到達するためです。
そのため、私のライブラリ API は、使用していた外部ライブラリ (およびそれぞれが独自の例外階層を持つ) からのすべての例外をユーザー コードに漏らしました。
これは私の質問につながります.例外をキャッチすると何ができるでしょうか?
すなわち、
- 外部ライブラリからキャッチされた例外を自分の例外に変換し、それを一般的な方法でスローできますか (サードパーティ ライブラリの例外階層と例外 API の間のマッピングが として提供されているとします
mpl::map
) ? - メッセージ/コールスタックを出力するよりも便利なことはありますか?たとえば、別の入力パラメーターを使用してスローサイトで関数を再開します(たとえば、
file_not_found
またはを取得したときにdisk_error
、別のファイルで関数を再実行します)? - 知っておく価値のある他のパターンはありますか?
ありがとう