S
Mathias schrieb:
Leider nicht !
Lt. Standard wird erst zur Laufzeit geprüft (wenn überhaupt), ob eine unerwartete Exception geworfen wird. In dem Fall wird unexpected() aufgerufen, die wiederum üblicherweise terminate() aufruft, das üblicherweise einen abort() durchführt .... sprich: Es hilft gar nichts !
Hab absichtlich nicht geschrieben, dass es im Standard steht, sondern wie es sein sollte. ...
Falls das nicht ironisch gemeint war: Dann kennzeichne das bitte zukünftig !
Mathias schrieb:
...
Wobei wenn ich mich recht entsinne, es durchaus Compiler gibt, die sowas auswerten (lang lang ist es her seit ich was mit dem gcc gemacht habe). ..
Glaube ich nicht.
Allein schon durch die Tatsache, dass "keine throws()-spec" interpretiert wird als "throws(*)", macht eine derartige Prüfung zur Compilezeit unmöglich - höchstens ganz banale Fälle kann man damit abfangen - und dafür macht sich bestimmt keiner die Mühe. Wenn ich aber in der Implementation meiner "throw-spec-freien" Funktion (die Du benutzt) in einer späteren Version eine neue exception werfe, darf ich das und Dein Compiler bekommt das Teil nicht mehr zu Gesicht => Kein Test zur Compilezeit mehr möglich.
Was schon erlaubt ist (und evtl. gemacht wird), ist das Abweisen von geerbten Funktionen mit abweichenden throw()-specs (innerhalb derselben Übersetzungseinheit). Sprich: Da, wo die throw-spec als Bestandteil des "Typs" interpretiert werden kann (obwohl es offiziell nicht erlaubt ist -> ISO Kap15.4.12).
Aber es steht explizit drin, dass ein Compiler Folgendes NICHT abweisen darf (ISO 15.4.10):
extern void f() throw(X, Y);
void g() throw(X) { f(); }
Da wird es schon eng für Compilerhersteller ....
Gruß,
Simon2.