例外ハンドラで実行したいコード自体が例外をスローする可能性があります。入れ子になったtry ... C++例外ハンドラの中にキャッチしますか?
以下のような構造が有効ですか?はいの場合、欠点はありますか?
try
{
// ...
}
catch (const E&)
{
try
{
// ...
}
catch (const F&)
{
}
}
例外ハンドラで実行したいコード自体が例外をスローする可能性があります。入れ子になったtry ... C++例外ハンドラの中にキャッチしますか?
以下のような構造が有効ですか?はいの場合、欠点はありますか?
try
{
// ...
}
catch (const E&)
{
try
{
// ...
}
catch (const F&)
{
}
}
いいえ、欠点はありません。それがあなたがそれをやるべき方法です。
これは完全に有効なコード作成方法です。
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
try //outer try{}
{
try //inner try{}
{
throw std::runtime_error("Demo");
}
catch (std::runtime_error& e)
{
std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
throw;
}
}
catch (std::exception& e)
{
std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
}
return 0;
}
実際には、ネストされたのtry/catchブロックを使用するためにも、興味深い技術がある:あなたが効果的に同じ例外処理を必要とする複数の機能を持っていると仮定します。特に別のインタフェースをラッピングする場合、これは一般的なシナリオです。この場合には、すべての例外をキャッチした例外ハンドラから関数を呼び出して、この機能では、実際の例外処理を実装するために、例外を再スローすることが可能である:
void fancy_handler() {
try {
throw; // assumes that fancy_handler() is called from catch-clause
} catch (std::runtime_error const& rt) {
std::cout << "runtime-error: " << ex.what() << "\n";
} catch (std::exception const& ex) {
std::cout << "excption: " << ex.what() << "\n";
} catch (...) {
std::cout << "unknown exception\n";
}
}
void foo() { try { do_foo(); } catch (...) { fancy_handler(); } }
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } }
を私はちょうど、重複回避大好き[非自明]コード!
待って、ネストされた関数から本当に 'スロー 'できますか?私はそのようなことを見たことがない! –
@MooingDuck:キャッチブロックから関数を呼び出した限り、例外を元に戻すことができます。さらに興味深いのは、これもJavaとC#で動作するということです(私はもともとこのJavaのテクニックを使って、膨大な数のデータベース例外を処理していましたが、私はJavaの専門家ではなくC++の専門家でした); –
標準を見て、細部とコーナーを学ばなければならない。 –
はい、その完全に有効です。 – Anand