2012-07-20 17 views
12
class A{ 
    public: 
     A() { throw string("exception A"); }; 
}; 

class B{ 
    A a; 
    public: 
     B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; }; 
}; 

int main(){  
    try{ 
     B b; 
    }catch(string& s){ 
     cout << &s << " " << s << endl; 
    } 
    return 0; 
} 

Die Ausgabe lautet:Exception wird zweimal gefangen

0x32c88 exception A 
0x32c88 exception A 

Da die Ausnahme bereits im Konstruktor B erwischt wurde, warum es dazu kommt noch in der Hauptfunktion?

Antwort

21

Wenn der Steuerfluss das Ende des Handlers für einen Funktionstry-Block eines Konstruktors erreicht, wird die abgefangene Ausnahme automatisch erneut ausgelöst.

Sie können eine während der Konstruktion einer Basisklasse oder eines Members in einem abgeleiteten Klassenkonstruktor ausgelöste Ausnahme nicht unterdrücken, da dies zu einem konstruierten abgeleiteten Objekt mit einer Basis oder einem Member führen würde, das nicht konstruiert werden konnte.

Diese GOTW ist relevant: http://www.gotw.ca/gotw/066.htm

Von ISO/IEC 14882: 2011 15.3 [except.handle]/15:

Die aktuell behandelte Ausnahme erneut ausgelöst wird, wenn die Steuerung das Ende eines Handler erreicht der Funktion-try-Block eines Konstruktors oder Destruktors. [...]

Verwandte Themen