可能性のある複製:
C++のポインターによる例外をキャッチ
例外は常に値でキャッチします。例えば
_try{
...
}
catch(CustomException e){
...
}
_
しかし、代わりにcatch(CustomException &e)
を含むコードに出会いました。これはa)細かいb)間違ったc)灰色の領域ですか?
C++の例外の標準的なプラクティスは...
値でスロー、参照でキャッチ
値によるキャッチは、継承階層に直面して問題があります。あなたの例では、MyException
から継承し、エラーコードのような項目をオーバーライドする別のタイプCustomException
があると仮定します。 MyException
型がスローされた場合、catchブロックによりCustomException
インスタンスに変換され、エラーコードが変更されます。
値でキャッチすると、スライス例外がキャッチした型の派生型である場合、例外オブジェクトになります。
これは、catchブロック内のロジックにとって重要な場合も重要でない場合もありますが、const参照によってキャッチしない理由はほとんどありません。
throw;
catchブロックにパラメーターがない場合、スライスされたコピーまたは例外オブジェクトへの参照をキャッチしたかどうかに関係なく、元の例外が再スローされます。
例外をいじりたくない場合は、通常const参照catch (const CustomException& e) { ... }
を使用する必要があります。コンパイラは、スローされたオブジェクトのライフタイムを処理します。
(CustomException e)
CustomExceptionの新しいオブジェクトが作成されます...そのため、(CustomException&e)では参照のみになりますが、コンストラクタが呼び出されます...新しいオブジェクトは作成されず、コンストラクタは呼び出されません...オーバーヘッド...後で使用することをお勧めします...