1

遭遇したコードに例外を実装する適切な方法を見つけようとしながら、少し調査しました

    Throw by value, catch by reference

C++ で例外を処理する推奨される方法です。スローされた例外がいつスコープ外になるかについて混乱しています。

次の例外階層があります

    ConnectionEx is mother of all connection exceptions thrown by dataSender
    ConnectionLostEx is one of the subclasses of ConnectionEx

ここにサンプルコードがあります。つまり、DataSender インスタンスは、send() などの dataSender の関数を呼び出す DataDistrubutor のメンバーであり、DataSender は、問題が発生した場合に ConnectionEx のサブクラスを例外としてスローします。

// dataSender send() function code chunk

try
{
   // some problem occured
       // create exception on stack and throw
   ConnectionLostEx ex("Connection lost low signals", 102);
   throw ex;
}
catch(ConnectionLostEx& e)
{
    //release resources and propogate it up
    throw ;
}

//A data distributor class that calls dataSender functions
try
{
    // connect and send data
    dataSender.send();  
}
catch(ConnectionEx& ex)
{
       // free resources
       // Is the exception not out of scope here because it was created on stack of orginal block?
       //propogate it further up to shows cause etc..

}

C#またはJavaでは、参照のようなポインターがあり、それがずっと有効であるため、正確にスコープ外になるときに例外が値によってスローされるため、例外のスコープについて混乱しています??? この場合、親タイプ ConnectionEx としてキャッチされると、これをキャストして、catch ブロックのチェーンのどこかで実際のタイプを取り戻すことができますか??

4

1 に答える 1

3

元のオブジェクトではなく、例外のコピーがスローされます。ローカル変数をインスタンス化してスローする必要はありません。例外をスローする慣用的な方法は、インスタンス化して同じ行にスローすることです。

throw ConnectionLostEx("Connection lost low signals", 102);
于 2013-01-25T14:40:44.433 に答える