Frage

Ist es möglich, Ausnahmen in diesen Szenarien zu behandeln:

  1. von Konstruktor geworfen vor dem Eintritt in main ()
  2. von destructor geworfen nach dem Verlassen main ()
War es hilfreich?

Lösung

  1. Sie können Ihren Konstruktor withing einen Try-Catch in der es einpacken.
  2. Nein, sollten Sie nie Ausnahme werfen in einem destructor ermöglichen.

Die lustige weniger bekannte Funktion, wie in einem Konstruktor einzubetten try-catch:

object::object( int param )
try
  : optional( initialization )
{
   // ...
}
catch(...)
{
   // ...
}

Ja, das ist gültige C ++. Der zusätzliche Vorteil ist hier die Tatsache, dass der Versuch Ausnahmen von den Konstrukteuren der Datenelemente der Klasse , auch geworfen werden fangen, wenn sie nicht in der Ctor initializer oder gibt es keine Ctor initializer erwähnt:

struct Throws {
  int answer;
  Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
};

struct Contains {
  Throws baseball;
  Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
};

Andere Tipps

Ja: keine gefährlichen globale Objekte verwenden

Es könnte möglich sein, einen Exception-Handler zu setzen, bevor Bau / Zerstörung der Objekte in Frage, dass man in der Lage sein soll, diese Ausnahmen zu behandeln.

Für Konstrukteure, gibt es einige seltsame neue Syntax, die Ausnahmen erlaubt im Konstruktor gefangen werden. Nicht sicher, wie das funktioniert, und es ist nicht häufig in vielen Compilern implementiert.

Für Destruktoren haben Sie den Inhalt des destructor in einem Versuch wickeln {code (); } Catch (...) {} Block. Welche nicht immer das gewünschte Verhalten, je nachdem, was Sie in diesem destructor erreichen wollen.

Kurze Antwort: no.

Jedes globales Objekt, das eine Ausnahme in seinem Konstruktor wirft wird eine nicht behandelte Ausnahme verursachen (das heißt, terminate bezeichnet werden).

Jede Klasse, die eine Ausnahme in seinem destructor wirft eine gebrochene Klasse.

das Singletonmuster Mit anstatt Globals wird Ihnen mehr Möglichkeiten geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top