2009-06-11 7 views
11

C++でthrow;を実行すると、キャッチブロック内で現在キャッチされた例外がブロック外に再発行されます。それはアウトですのでポインタまたは値を投げるスローを行うとどうなりますか?文はcatchブロックの外で実行されますか?

try { 
    CodeThatMightThrow(); 
} catch(...) { 
    ExceptionHandler(); 
} 

void ExceptionHandler() 
{ 
    try { 
     throw; 
    } catch(FileException* e) { 
     //do handling with some complex logic 
     delete e; 
    } catch(GenericException* e) { 
     //do handling with other complex logic 
     delete e; 
    } 
} 

はどんな違いがありません:例外ディスパッチャのアイデアは、多くの場合、複雑な例外処理を使用するときにコードの重複を削減するソリューションとして育てているthis answer

問題の

ExceptionHandler()がcatchブロックから呼び出されないとどうなりますか?

int main(int, char**) 
{ 
    try { 
     throw; 
    } catch(...) { 
     MessageBox(0, "", "", 0); 
    } 
    return 0; 
} 

まずそれが初回例外を示すために、デバッガが発生し、その後すぐに未処理の例外:

私はVC7でこのコードを試してみました。このコードをデバッガの外で実行すると、abort()が呼び出されたときと同じようにプログラムがクラッシュします。

このような状況で予想される動作は何ですか?規格から

+0

これはWindowsとは関係がないため(ただし、良い質問です)、「ウィンドウ」タグを削除しました。 –

答えて

23

、15.1/8

例外は、現在のないオペランドとスロー発現std::terminate()を呼び出して実行し、取り扱いされていない場合。

+0

あなたが私にそれを打つ、b)あなたが標準を引用したから、私は(ほとんど)重複した答えを削除します – Glen