遭遇したコードに例外を実装する適切な方法を見つけようとしながら、少し調査しました
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 ブロックのチェーンのどこかで実際のタイプを取り戻すことができますか??