Fehlerbehandlung in Visual Basic
und Exception Handling in C++
Behandlung von Laufzeitfehlern in Visual Basic
Fehler, die beim Ausführen eines Programmes, also zur Laufzeit, auftreten, heißen Laufzeitfehler. Oft liegen die Ursachen für einen derartigen Fehler außerhalb des Programmes, beispielsweise wenn eine Datei auf der Festplatte nicht gefunden wird oder eine Diskette nicht gelesen werden kann.
On Error { Resume Next | GoTo { Programmzeile | Sprungmarke | 0 } } 44152pvv42ypc4b
Mit dieser Anweisung wird die Fehlerbehandlung festgelegt. Durch die Anweisung on Error GoTo kann eine Fehlerbehandlungsroutine aktiviert bzw. deaktiviert und die Position dieser Routine innerhalb der Funktion bzw. Prozedur angegeben werden.
Wenn ein Fehlerbehandler aktiviert wurde, bewirkt jeder Laufzeitfehler einen Sprung zur Fehhlerbehandlungsroutine. Der Fehlerbehandler wird in dem Moment aktiv, in dem ein Laufzeitfehler aufgefangen wurde, und bleibt es, bis in ihm eine der Anweisungen Resume, Exit Sub oder Exit Function ausgeführt wird.
Durch die Anweisung On Error GoTo 0 wird die Fehlerbehandlung deaktiviert.
Tritt ein Fehler in einer Prozedur ohne Fehlerbehandlung auf, wird die aufrufende Prozedur durchsucht, wenn es auch dort keine Fehlerbehandlung gibt, wird in deren aufrufender weitergesucht usw., bis entweder eine Routine gefunden oder die oberste Ebene erreicht wird. Durch ein Resume wird dann die fehlerverursachende Prozedur wieder aufgerufen, durch ein Resume Next wird das Programm bei der Anweisung nach dem fehlerverursachenden Prozeduraufruf fortgesetzt. vp152p4442yppc
Err-Objekt: liefert Fehlercode
Resume: wiederholt die fehlerverursachende Anweisung
Resume Next: setz die Programmausführung bei der Anweisung nach der fehlerverursachenden fort
Es gibt grundsätzlich 3 Möglichkeiten der Fehlerbehandlung:
- Keine Behandlung
Bewirkt im Fall eines Laufzeitfehlers einen Programmabbruch.
- Verzögerte Behandlung
On Error Resume Next: Die Standardfehlerbehandlung wird bis zum Ende der jeweiligen Prozedur bzw. bis zu anderen On Error... - Anweisungen ausgeschaltet. Mit Hilfe des Err-Objekts kann festgestellt werden, ob und welche Fehler aufgetreten sind.
- Sofortige Behandlung
On Error GoTo Fehlerbehandler : Ein Fehlerbehandler wird aktiviert und bleibt bis zum Ende der jeweiligen Prozedur wirksam. Bei einem Fehler wird zum Code an der Sprungmarke Fehlerbehandler verzweigt. Diese Sprungmarke befindet sich sinnvollerweise am Ende der Prozedur, vor ihr wird die Prozedur dur Exit Sub bzw. Exit Function verlassen.
Beispiel:
Sub Beispielprozedur()
On Error GoTo Fehler
...
Exit Sub
Fehler:
...
Resume Next
End Sub
Ausnahmebehandlung in C++ (Exception Handling)
Unter einer Ausnahme versteht man eine Fehlersituation. Ausnahmebehandlung dient zum Behandeln von Fehlern, die nicht an jener Programmstelle behandelt werden können oder sollen, wo sie auftreten.
throw beim Erkennen eines Fehlers wird eine Ausnahme ausgeworfen
try Programmteile werden überwacht, ob bei ihrer Abarbeitung Ausnahmen auftreten
try-Blöcke sind Anweisungen und können geschachtelt werden
Direkt nach jedem try-Block muß mindestens ein Ausnahme-Behandler (catch-Block) folgen
catch Der Ausnahmebehandler reagiert bei Ausnahmen in einem von try überwachten Programmteil
Der Code eines catch-Blocks kann nur mittels throw erreicht werden
Beispiel:
void funktion()
{
...
if (fehler) throw 1;
...
}
void main()
{
...
try
{
...
funktion();
}
catch(int)
{
cout << “Fehler!“;
}
...
}
Wenn innerhalb des try-Blocks bzw. in einer dort aufgerufenen Funktion mit throw eine Ausname vom Typ Integer ausgeworfen wird, so wird der Ausnahmebehandler catch(int) ausgeführt, der die Ausnahme abfängt.
Unterschiedliche Ausnahme-Typen
Nach einem try-Block folgt normalerweise eine Liste von mehreren verschiedenen catch-Blöcken.
Welcher catch-Block beim Auftreten einer Ausnahme ausgeführt wird, wird durch den Typ der
Ausnahme festgelegt, d.h. den Typ des Ausdrucks hinter dem Schlüsselwort throw, dem Typ des ausgeworfenen Objekts.
Ausgeworfene Objekte können beliebigen Datentyen angehören, auch benutzerdefinierte (Klassen) sind möglich.
Das ausgeworfenene Objekt wird als Parameter an den passenden catch-Block übergeben und kann im catch-Block verwendet werden (catch (int &i))
Fortsetzen des Programms nach einer Ausnahme
Nach dem Auswerfen einer Ausnahme wird zum nächsten passenden catch-Block verzweigt. Es wird nach dem „innersten“ try-Block der noch nicht beendet wurde gesucht und seine Behandler-Liste nach einem passenden catch-Block durchsucht. Wenn keiner vorhanden ist, wird die Suche im umschließenden try-Block fortgesetzt usw. Wird kein passender catch-Block gefunden, so wird das Programm abgebrochen.
Möglichkeiten für einen passender catch-Block:
Typ des ausgeworfenen Objekts stimmt exakt mit der catch-Typ überein
catch-Typ ist eine Basisklasse des ausgeworfenen Objekts
Es wurde kein catch-Typ angegeben: catch(...)
Die Behandler-Liste eines try-Blocks wird von vorne nach hinten durchsucht, bis ein passender Behandler gefunden wird, bei mehreren passenden wird nur der erste in der Liste aktiviert.
Wenn ein passender Ausnahmebehandler gefunden und abgearbeitet wurde, wird das Programm nach der Behandler-Liste fortgesetzt.
Es gibt keine Möglichkeit, zur Auswurfstelle zurückzukehren.
Fehlerbehandlungsklassen
Mit einem catch können mehrere Auswurfobjekte abgefragt werden. Wenn das ausgeworfene Objekt ein Objekt einer abgeleiteten Klasse ist, wird die Fehlerbehandlungsroutine der Basisklasse durchgeführt. So kann mit dem selben catch (der Basisklasse) auf mehrere Auswurfsobjekte der abgeleiteten Klassen abgefragt werden.
Beispiel:
class Ausnahme {
const char *text;
public:
Ausnahme (const char *s) { text=s; }
const char *Text () { return text; }
};
class Fehler_X : public Ausnahme {
public:
Fehler_X () : Ausnahme (“Fehler X aufgetreten!“) {}
};
class Fehler_Y : public Ausnahme {
public:
Fehler_Y () : Ausnahme (“Fehler Y aufgetreten!“) {}
};
void main()
{
try {
...
try {
...
if (x==-1) then throw Fehler_X();
if (y>999) then throw Fehler_Y();
}
catch (Fehler_X &f) {
...
cout << f.Text << endl;
}
}
catch (Ausnahme &a) {
cout << a.Text << endl;
}
}
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen