Ich bin mir nicht sicher, ob dies ein Problem mit dem Compiler ist oder ob ich etwas falsch mache. Ich verwende den Visual Studio 2013-Compiler.Konstruktor als Funktion try Block - Ausnahme bricht Programm ab
Ich habe eine Klasse, wo ich erhebliche Menge an Ressourcen in meinem Konstruktor Initialisierungsliste erwerben müssen, von denen die meisten eine Ausnahme auslösen können. Ich habe die Member-Initialisierer-Liste in einem Funktionstry-Block eingepackt und dort die Ausnahme abgefangen. Aber mein Programm bricht immer noch ab, obwohl die catch-Klausel die Ausnahme nicht erneut auslöst. Ich darf den eigentlichen Code nicht posten. Also habe ich das Problem mit diesem äquivalenten Demo-Code reproduziert. Kann mir bitte jemand helfen?
#include <iostream>
using namespace std;
class A{
public:
A() try : i{ 0 }{ throw 5; }
catch (...){ cout << "Exception" << endl; }
private:
int i;
};
int main(){
A obj;
}
Bei der Ausführung dieses Codes bekomme ich einen Windows-Alarm "abort() wurde aufgerufen". Ich nehme an, dass das System dies als eine nicht abgefangene Ausnahme behandelt und terminate() aufruft.
Auf der anderen Seite, wenn ich die Konstruktion des Objekts in main() in einem try-catch-Block wickeln, dann wird die Ausnahme richtig gefangen und das Programm wird normal beendet.
Kann mir bitte jemand sagen, ob ich hier etwas falsch mache?
Blick auf http://www.gotw.ca/gotw/066.htm für eine Diskussion über dieses Problem –
Vielen Dank Jan Herrmann. Es ist offensichtlich sehr sinnvoll, wenn der Standard sagt, wenn eine Ausnahme nicht erneut ausgelöst wird oder wenn eine neue Eszeption nicht aus der Funktion try block des Konstruktors geworfen wird, wird sie am Ende des catch-Blocks automatisch erneut ausgelöst. Das macht jetzt vollkommen Sinn. Vielleicht, wie vorgeschlagen, Pimpl Idiom ist, was ich anfangen sollte zu verwenden. Nochmals vielen Dank. – Madhusudhan
Zusätzliche Punkte für * "Ich darf den eigentlichen Code nicht posten. Also habe ich das Problem mit diesem äquivalenten Democode reproduziert. "* Sie haben eine sehr gute [MCVE] erstellt (https://stackoverflow.com/help/mcve). – 5gon12eder