🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #202

Globale Objekte, exception aus Konstruktor

#202
From: Stephen Friedrich
Date: Wed, 02 Aug 1995 13:45
104 lines
2991 bytes
Hallo Leute,

weiss jemand eine Loesung fuer folgendes Problem?

Ein Objekt ist global deklariert. Der Konstruktor dazu
loest eine Exception aus. Wie kann ich diese abfangen?

Das ist IMO ein generelles C++-Problem. Mir stellt es sich
unter SunOS 4.1.2 auf einer SparcStation mit gcc 2.6.3.

Also:

//--------- Except.cxx ---------------------------------

class Except {};

class Global {
   public:
      Global(void) { throw Except(); };
};

Global aGlobal;

int main(int argc, char* argv[]) {};

//-------------------------------------------------------`

Compiliert mit
   g++ -g -fhandle-exceptions -o Except Except.cxx
bewirkt die Ausfuehrung natuerlich nur die Ausgabe von
"Abort".

Ich habe ausprobiert einen terminate()-Handler zu 
installieren, der innerhalb eines try{} ein rethrow 
macht.
Das scheint jedoch nicht moeglich zu sein.
Folgendes fuehrt nach einmaliger Ausgabe von "rethrow!"
zu einer Endlosschleife innerhalb der gcc-Laufzeit-
Bibliothek:

//--------- Except.cxx ---------------------------------

#include <iostream.h>

class Except {};

typedef void(*PFV)();
PFV set_terminate(PFV);

PFV old;

void rethrow(void) {
   cout << "rethrow!" << endl << flush;
   set_terminate(old);
   try {
      throw;
   }
   catch(Except a) {
      cout << "TestException!" << endl << flush;
      abort();
   };
};

class CatchException {
   public:
      CatchException();
};

CatchException::CatchException (void) {
   old = set_terminate(&rethrow);
};

CatchException aCatchException;

class Global {
   public:
      Global(void) { throw Except(); };
};

Global aGlobal;

int main(int argc, char* argv[]) {};

//-------------------------------------------------------

Es ist sicher im allgemeinen nicht sinnvoll Objekte global
zu deklarieren. Einige Application-Frameworks verlangen das
jedoch fuer bestimmte Objekte, eben um noch vor main()
Initialisierungen zu machen.

Im uebrigen interessiert mich generell eine Loesung.
C++ scheint kein Konzept zu haben, das nicht irgendwo Luecken
oder Unsauberkeiten hat...

Waere dafuer nicht die Moeglichkeit sinnvoll globale 
catch()-Funktionen zu schreiben?


----------------------------------------------------------
Stephen Friedrich, Mettlerkampsweg 2, 20535 Hamburg
email     : 1friedri@informatik.uni-hamburg.de
            Stephen.Friedrich@Hamburg.Netsurf.de
Compuserve: 100440,3434
Fax       : +49 40 218418
Technical Details
Message-ID: <3vnvio$f95@rzsun02.rrz.uni-hamburg.de>
Path: arc1-ca.pugleaf.net!swt6.informatik.uni-hamburg.de!1friedri

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!swt6.informatik.uni-hamburg.de!1friedri
From: 1friedri@informatik.uni-hamburg.de (Stephen Friedrich)
Newsgroups: de.comp.lang.c++
Subject: Globale Objekte, exception aus Konstruktor
Date: 2 Aug 1995 13:45:59 GMT
Organization: University of Hamburg -- Germany
Sender: 1friedri@swt6.informatik.uni-hamburg.de (Stephen Friedrich)
Message-ID: <3vnvio$f95@rzsun02.rrz.uni-hamburg.de>
NNTP-Posting-Host: swt6.informatik.uni-hamburg.de
Keywords: c++, exception, error handling, object construction