2012-02-05 7 views
1

流れ中断されません。 これはC++のデフォルトの動作であるかわかりません。 「はい」の場合は、例外が酷いときに命令フローを中断したい場合はどうすればよいですか? これは私がメインで何をすべきかの例である:「こんにちは」の文字列が印刷された画面で例外は、命令が、私は例外をしようとするクラスを作った

int main(int argc, char **argv) 
{ 
    try 
    { 
     if(1) 
      throw precExcp(); 
    } 
    catch(precExcp& e) 
    { 
     cerr << e.what() <<endl; 
    } 
    cout << "hello" <<endl; 
} 

ことは正常ですか?これを避ける方法は?

+1

'class precExcp:public exception'を必ず実行してください。 –

+1

キャッチ内に戻ってみましたか? – George

答えて

1

それをtryブロックに入れます。

try 
{ 
    if(1) 
     throw precExcp(); // throwing here will skip all remaining 
         // instructions in the try block 
    cout << "hello" <<endl; 
} 
catch(precExcp& e) 
{ 
    cerr << e.what() <<endl; 
} 

また、これはJavaまたはPythonではありません。 C++例外処理では、一般的に、あなたが主な回復元がデストラクタ(@see RAII)になるので、複数の異なる例外タイプを定義したり、catchしたりする必要はありません。最終的にはブロック)。多くの場合、const std :: exception &(それのサブクラスをprecExcpにする)をキャッチすることができますが、まれにしかそれほど細かいチェックは必要ありません。

また、再スローすることができます:

try 
{ 
    if(1) 
     throw precExcp(); // throwing here will skip all remaining 
         // instructions in the try block 
} 
catch(precExcp& e) 
{ 
    cerr << e.what() <<endl; 
    throw; // throw the original exception 
} 

をただし、あなたがメインでこれを行うと、第2スローをキャッチするために何のcatchブロックを持っていない場合、またはであってもなくてもよい未処理の例外でクラッシュして何が起こっていますかあなたは探している。

4

例外が発生した場合は、ブロックされたとみなされ、try/catchブロックの最後に実行が再開されます。

あなたは例外がさらにチェーンを継続(および潜在的にそれがキャッチされていない場合に停止するプログラムを引き起こす)したい場合は、catchthrowを追加します。

catch(precExcp& e) 
{ 
    cerr << e.what() <<endl; 
    throw; 
} 

そして、あなたがしたい場合は例外を上向きに伝播したり実行を再開させたりする代わりにプログラムを停止させることができます。exitmainであるためこの場合はreturn)を呼び出すことができます。

+0

ああ、右、かなり馬鹿:) –

1

はい、それが普通です:あなたはcatchブロックに例外をキャッチし、その例外は、それが提起されたtry/catch - ブロックの外に伝播されません。

0

これは何かが好きではない行くときに、あなたの不安定なコードが、tryブロックに配置され、正常な動作ですあなたは例外を扱うことができるときにcatchブロックが実行される必要があり、このプロセスの後、あなたはでtry後に呼び出され、オプションfinallyブロックを使用することができます成功し、失敗したのはcatchです。そのコードが正常に実行された後、コード実行はtryブロックでのみ停止されます。この機能の実行を停止する場合は、returnが必要です(catchブロック内)。

0

まあ、スローされた例外をキャッチしたので正常です。例外はtryブロックの内部で発生した場合に実行したくないコードの一部を入れて:あなたは「hello」を出力をスキップする場合は、私は、あなたの質問から理解できるものに基づいて

try { 
    throw precExcp(); 
    cout << "hello" <<endl; 
} 
catch(precExcp &e) { 
    // ... 
} 
関連する問題