0

重複の可能性:
例外がキャッチされた後に例外の種類を決定していますか?

C# での例外処理を認識しています。

try{
// code causing exception
}
catch(System.Exception e){
// Here e variable holds the information about the actual exception that has occured in try block.
}

しかし、私はVC ++(VS 2008上)で同じことを達成したいです。VC++にはパッケージの概念がないため、VC++ の try ブロックで発生した例外の TYPEをどのようにキャプチャしますか?

4

2 に答える 2

1

C ++にはすべての例外に対して単一の基本クラスがないため、唯一のオプションは、処理するものを指定することです。

try
{
}
catch (const std::exception& e)
{
}
catch (const my_base_exception& e)
{
}
catch (const some_library_base_exception& e)
{
}
catch (...)
{
// ups something unknown
}

ただし、my_base_exceptionから派生した場合はstd::exception、によってインターセプトされることに注意してください。その場合はcatch (const std::exception& e)、これら2つのキャッチを交換してください。同じことが言えますsome_library_base_exception

于 2012-12-03T10:16:16.090 に答える
0

C++ では、通常、型をチェックするのではなく、 がキャッチできる型を指定します。catch

キャッチされた の最も派生した型をログに記録したい場合、 はポリモーフィック型であるため、std::exceptionを介してその情報を取得できます。typeidstd::exception

標準の例外タイプ階層の外にある例外のタイプをログに記録することに関心がある場合は、一般的に ( を使用して) キャッチし、可能性のある非標準例外を認識し、それらを再スローおよび es...する共通の再スローワー関数を呼び出すことをお勧めします。catchこれにより、ロジックが集中化されます。しかし、おそらくあなたの質問は、このやや高度でまれな手法 (行儀の悪いライブラリの使用にのみ関連する) に関するものではなく、C++ での例外処理に関する単純な誤解であり、その答えは、関連する型を指定することです。各catch句で、キャッチする準備ができていること。

于 2012-12-03T10:41:02.807 に答える