web-dev-qa-db-ja.com

C ++ catchブロック-値または参照によって例外をキャッチしますか?

可能性のある複製:
C++のポインターによる例外をキャッチ

例外は常に値でキャッチします。例えば

_try{
...
}
catch(CustomException e){
...
}
_

しかし、代わりにcatch(CustomException &e)を含むコードに出会いました。これはa)細かいb)間違ったc)灰色の領域ですか?

91
Mr. Boy

C++の例外の標準的なプラクティスは...

値でスロー、参照でキャッチ

値によるキャッチは、継承階層に直面して問題があります。あなたの例では、MyExceptionから継承し、エラーコードのような項目をオーバーライドする別のタイプCustomExceptionがあると仮定します。 MyException型がスローされた場合、catchブロックによりCustomExceptionインスタンスに変換され、エラーコードが変更されます。

135
JaredPar

値でキャッチすると、スライス例外がキャッチした型の派生型である場合、例外オブジェクトになります。

これは、catchブロック内のロジックにとって重要な場合も重要でない場合もありますが、const参照によってキャッチしない理由はほとんどありません。

throw; catchブロックにパラメーターがない場合、スライスされたコピーまたは例外オブジェクトへの参照をキャッチしたかどうかに関係なく、元の例外が再スローされます。

27
CB Bailey

例外をいじりたくない場合は、通常const参照catch (const CustomException& e) { ... }を使用する必要があります。コンパイラは、スローされたオブジェクトのライフタイムを処理します。

9
Marcelo Cantos

(CustomException e) CustomExceptionの新しいオブジェクトが作成されます...そのため、(CustomException&e)では参照のみになりますが、コンストラクタが呼び出されます...新しいオブジェクトは作成されず、コンストラクタは呼び出されません...オーバーヘッド...後で使用することをお勧めします...

2
Mihir Mehta