1

この辺りにも同様の質問があると思いますが、見つかりません。

例外の階層全体をスローする可能性のあるいくつかの関数があるとします。たとえば、N種類の例外クラスがあるとします。

さて、 N ブロックで同じコードを数回書く代わりに、これらすべての例外を処理する良い方法はありcatchますか?

私がこれを達成する(非常に醜い)方法は、マクロを使用することです。他のアイデア?

すべての関数は、異なる入出力パラメーターと戻りタイプを備えています


編集

はい、すべての例外は同じ基本クラスを持っています-それは階層です。ただし、クラスが異なれば、追加情報も異なります。

例:

try
{
    object->execute( ... );
}
catch( type1& ex )
{
    // ...
}
//...
catch( typeN& ex )
{
    // ...
}

// some other code
// and again:

try
{
    object->do_something_else( ... );
}
catch( type1& ex )
{
    // ...
}
//...
catch( typeN& ex )
{
    // ...
}

// and so on
4

3 に答える 3

3

handleExceptions(Exception&)例外の基本クラスへの参照を取得するという関数を作成します。

その関数では、例外を除いて好きなことを行うことができます。たとえば、のサブクラスに固有の仮想メソッドを呼び出すことができますException。また、実際にどのような例外があるかdynamic_castなどを定義することもできます。

于 2012-07-02T10:23:22.770 に答える
2

基本クラスでキャプチャし、handleExceptionメソッドに例外を与えて、実際の基になる型をオンにすることについては、すでに説明しました。これは、別のアプローチです。これは逆になります。

関数を記述してexception_check、ファンクターを取得し、適切な内部にネストして実行することができますtry..catch

template<typename Func>
Func exception_check(Func fun)
{
    try
    {
        func();
    }
    catch( type1& ex )
    {...}
    //...
    catch( typeN& ex )
    {...}
    return func; //in case the functor stores a result. 
}

もちろん、結果のコードがひどく醜く見えないようにこれを機能させるには、ラムダ関数を備えたC ++ 11が必要です。そうしないと、コードが多くのファンクターに分散するためです。ラムダ関数を使用すると、次のように簡単に呼び出すことができます

exception_check([&](){ object->execute(...); }); 
exception_check([&](){ object->do_something_else(...); }); 

個人的には、これを読んでから、各関数呼び出しを1回試行/キャッチする方が良いと思います。

もちろん、c ++ 11では、ファンクターをコピーするのではなく、完全な転送を使用することをお勧めします。

于 2012-07-02T13:34:50.523 に答える
1

これらの呼び出しを内部のスイッチで1つの関数に組み合わせることができない限り、traget関数の各呼び出しには独自のtryブロックが必要です。

typeid基本クラスをキャッチし、操作またはその他の方法を使用して内部で発生する可能性のある例外のタイプを区別する共通関数を呼び出すことができます。例外が発生することはめったにないため、RTTIの使用によるオーバーヘッドは許容できる場合があります。

于 2012-07-02T10:26:43.737 に答える