šHgeocities.com/Vienna/Stage/4793/excp4.htmgeocities.com/Vienna/Stage/4793/excp4.htmdelayedx׏ÕJ’’’’’’’’’’’’’’’’’’’’Č0¤£ŗOKtext/htmlĻBmoŗ’’’’b‰.HMon, 18 Dec 2000 15:41:57 GMTäMozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)en, *׏ÕJŗ Exceptions

Zurück ] Nach oben ] Weiter ]

 

Exceptions & Klassen

... in Konstruktoren

Mit den konventionellen Arten der Fehlerbehandlung kann ein Fehler im Konstruktor eines Objektes nur umständlich abgefangen werden, da dieser keinen Returncode liefert. Das Exceptionhandling erlaubt es, diese Information schon aus dem Konstruktor heraus zu melden.

Mit dem bisher beschriebenen Exceptionhandling ergibt sich aber das Problem, daß das Exceptionobjekt außerhalb der Klasse bearbeitet würde. Um solch eine Behandlung an eine Klasse zu binden, gibt es die Möglichkeit, Methoden einer Klasse mit einem try-catch-Block zu umgeben. Dies könnte so aussehen:

class X {
    Vector v;
    ...

public:
    X(int); // Konstruktor
    ~X()    // Destruktor
    
    // ....  
}  

X::X(int s)  
try  
    :v(s) // Init des Vektors mit s  
{ 
    ...  
}
catch ( Vector::Size ) 
{
    // Ausnahmen für v werden hier gefangen
}

X::~X()  
try { 
    f(); // könnte eine Ausnahme werfen
}  
catch (...) { 
    // mach was  
}

Ein Hinweis noch zu Copy-Konstruktoren. Da diese implizit aufgerufen werden und häufig Ressourcen belegen und freigeben, erwartet die Standardbibliothek richtiges Verhalten ohne Werfen von Ausnahmen. Deswegen sollte ein Copy-Konstruktor nur unter katastrophalen Umständen eine Ausnahme werfen.

... in Destruktoren

Im Rahmen des Exceptionhandlings kann ein Destruktor auf zwei Weisen aufgerufen werden:

Normaler Aufruf: Als Ergebnis eines normalen Verlassens des Gültigkeitsbereichs, eines delete usw...

Aufruf währen der Ausnahmebehandlung: Während der Stackabwicklung verläßt der Ausnahmebehandlungsmechanismus einen Gültigkeitsbereich, der ein Objekt mit einem Destruktor enthält.

Im zweiten Fall darf keine Ausnahme aus dem Destruktor herauskommen. Falls doch wird es als Fehler im Exceptionhandling bewertet und terminate() aufgerufen. Wenn dieser Abbruch unerwünscht ist, kann man den Destruktor wie auch den Konstruktor mit einem try-catch-Block schützen (siehe obiges Programmbeispiel).