2011-07-19 6 views
6

私は最近、いくつかのC++のコードで何か面白いものを見た:C++ "キャッチ(...)は、" パラメータ

try { 
    //doStuff 
} catch (...) { 
    //doStuff 
} 

を "..." 私が参照してるものです。

ここで一見すると、これは、私たちが見る "doStuff"に似たコメントのようなものであると思うかもしれません。変わったことは、Eclipse CDTでこれを入力すると、実際には構文エラーを出すことなく動作するということです。

これには特別な目的はありますか?

+0

この特殊な構文はおそらく自然な英語の慣習との類似性のために選択されました。 –

答えて

6

他の人が触れたように、それはすべてをキャッチします。私が見てきたことから、実際にスローされる例外を特定できないときには、これが主に使用されます。そして、例外がStructured Exceptionで、これはC++ではない場合に起こります。たとえば、無効なメモリ位置にアクセスしようとするとします。これらの「すべてをキャッチする」ことは、通常、良い習慣ではありません。スタックトレースを取得するための(移植可能な)方法がなく、スローされた例外について何も知らない。

例や非常に単純な場合以外の理由でこれを使用すると、著者が認識できない例外を適切に処理しないことでプログラムの不安定さを隠そうとしていることを示している可能性があります。このような場合には、プログラムをクラッシュさせ、後で分析できるクラッシュダンプを作成することをお勧めします。または、structured exception handlerを使用してください(VSを使用している場合は、他のコンパイラでどのように行われているのか分かりません)。

3

「キャッチエリプシス」とは、「例外が何であってもキャッチしてここで処理する」という意味です。特定のタイプの例外のみをキャッチするcatch(SpecificType)と異なり、catch(...)はすべてのC++例外をキャッチします。

+1

例外を除き、実際の例外オブジェクトを取得する方法はありません。 :-( –

+4

@Chris、実際には方法があります。それをやり直して再びキャッチすることは便利ですが、一般的な例外処理を別の関数に移すことができます。 'try {something()} catch {// Aの} catch(MyErrorB&){//そのa B} //それ以外の場合は取得します。誰かのために他の人がキャッチするための再考}。 –

+0

@Michael:ファンシー!+1 –

6

キャッチオールです。
スローされたあらゆるタイプの例外をキャッチします。
使用中すべてのキャッチハンドラーの最後に配置されていることを確認するか、タイプに関係なくすべての例外をキャッチします。

1

tryブロックから返される可能性のある例外がいくつかあります(認識できない場合や特に処理したくない場合)、そのコードを記述することができます。 すべての例外をキャッチします。

関連する問題