2011-12-15 3 views
-1

私はこのコードを持っている:私の例外タイプを捕まえても、私のプログラムが例外からクラッシュするのはなぜですか?

printf("hello\n"); 
try 
{ 
    for (unsigned i = 0; i < par.size(); i++) 
     rep.delete_rev(par[i]); 
} 
catch(TriedToDeleteRoot e) 
{ 
    printf("catched 1 !\n"); 
} 
catch(...) { 
    printf("catched sth else !\n"); 
} 
printf("hahaha\n"); 

を、これは私が出力に持っているものです。

hello 
terminate called after throwing an instance of 'TriedToDeleteRoot' 
    what(): Tried to delete root 

なぜですか? TriedToDeleteRootはstd :: exceptionから継承しています。何が間違っているのか分かりません。ありがとう。

EDIT: これは私が例外をスローする方法である:

throw TriedToDeleteRoot(); 
+0

コードは関数内に存在する必要があります。あなたは 'delete_rev'の実装と' rep'が持っているどんな型の定義も投稿できますか? –

+1

私たちが見ることができないコードの他の場所から投げられる可能性がありますか?問題を実証する*最小*しかし完全な例を表示できますか? – Flexo

+3

あなたはまだ前のものを扱っている間に2番目の例外を投げている可能性があります。これは* bad *となり、IIRCはcatchブロックによってどのような例外が処理されているかにかかわらず、 'std :: terminate'を呼び出すことになっています。 – Flexo

答えて

4

私の推測では、TriedToDeleteRootが失敗しているためコピーコンストラクタです。

私はconst参照でキャッチ(いつものように)お勧め:

try 
{ 
    for (unsigned i = 0; i < par.size(); i++) 
     rep.delete_rev(par[i]); 
} 
catch(const TriedToDeleteRoot& e) 
{ 
    printf("caught 1 !\n"); 
} 

または一般的な場合:

catch(const std::exception& e) 
{ 
    std::cerr << "exception: " << e.what() << std::endl; 
} 
1

あなたはstd::terminateはあなたがtryを持っているにもかかわらず呼び出されていることを観察しています/ catchあなたがスローされている例外と一致すると予想します。

これは、以前の例外が処理されている間に例外をスローした場合に発生する可能性がある1つの理由です。これはabort()やプリントを呼び出し、私のシステムでは

#include <iostream> 

int main() { 
    try { 
    struct test { 
     ~test() { throw 0; } 
    } test; 
    throw 0; 
    } 
    catch (...) { 
    std::cout << "Caught something" << std::endl; 
    } 
} 

:あなたがでこれを観察することができcatch(...)が得ることはありませんことを

が「int型のインスタンスを投げた後に呼び出さ終了し

お知らせこのためにヒットしました。

この簡単な例は、間違って起こる最も簡単な方法を示しています - throwing from within a destructor。あなたが示したことから私の最高の推測は、これが起こっていることです。デバッガはあなたのためにこれを確認しなければなりません。

+1

+1。これを答えにしてくれてありがとう。道徳:デストラクタが例外を出さないようにする。 –

関連する問題