2016-10-31 10 views
1

C++で例外をキャッチすることに関して質問があります。 我々は値でキャッチしている次の例を考えてみます。例外C++:参照/値でキャッチ

struct baseException{}; 
struct derivedException : public baseException {}; 

void g(){ 
    // Bad stuff 

    if(!stuff) 
     throw derivedException(); 
    else 
     throw baseException(); 
} 

void f(){ 
    try{ 
     g(); 
    } 
    catch(derivedException e){ 
     // Caught derived exc 
    } 
    catch(baseException){ 
     // Caught base exc 
    } 
} 

はのはbaseExceptionがスローされたとしましょう。コンパイラはderivedExceptionbaseExceptionの特殊化であることを理解していないので、より正確なcatch節(baseException)を選択しますか?

derivedExceptionがスローされ、catch節の順序が逆転した場合、スライシングが行われることに同意しますが、この場合何が起こるかはわかりません。コンパイラがそれを特殊化として認識できないのはなぜですか?

私はそれが間違った方法であることに同意します。多形性プロパティを保存するためには常に参照する必要がありますが、コンパイラーがその特殊化を認識できない理由を知りたいと思います。

+2

"ポリモリックプロパティを節約する"他の理由もあります。たとえば、bad_allocのために投げた場合、どうすればより多くのメモリを割り当てるのですか? – UKMonkey

+0

あなたの質問は何もできません。あなたのコードによれば、 'derivedException'がスローされると' derivedException'が捕捉されます。 'baseException'がスローされると、' baseException'が引き起こされます。 – songyuanyao

+0

また、コピーを避けるために参考にしてください。 – Hayt

答えて

3

catch句のルールは、が最初にと一致するルールです。オーバーロードされた関数とは異なり、「最良の」マッチングという概念はありません。

例コードでは、stuffがfalseの場合、スローされた例外の型がderivedExceptionであるため、catch(derivedException)の本文が実行されます。 stuffがtrueの場合、最初のcatch句が一致しないため、catch(baseException)のためのボディが実行されますが、catch句が逆転した場合、2番目の1はstuff、身体の値にかかわらず、その後..

ん(catch(baseException))が実行されます。両方の例外が基本型によってキャッチされる可能性があるからです。

+0

逆の順序であれば、実際にベースキャッチを選択すると思っていました。その明確化のためにありがとう! –