catch

Das catch-Keyword ist nur in C++ definiert und dient dazu, eine Ausnahmebehandlung einer try-catch-Struktur zu definieren. Das catch-Keyword erwartet in runden Klammern () einen Typ und definiert durch den darauffolgenden Codeblock die eigentliche Behandlungs-Routine. Eine Exception wird mittels dem throw-Operator erzwungen, womit augenblicklich zu dem entsprechenden catch-Teil gesprungen und die Ausführung dort fortgesetzt wird.

#include <stdio.h> void openfile(){ FILE* file = fopen("notexistingfile.txt", "r"); if(!file){throw "Could not open file!";} } int main(int argc, char** argv){ try { openfile(); } catch(const char* e){ printf("An error occured:\n%s\n", e); } return 0; }

An error occured: Could not open file!

Siehe auch try-catch, throw, ... (catch-all)

Details

Der catch-Block kann als Funktionsdefinition angesehen werden, welche einen Parameter mit beliebigen Typ (ausser void) erwartet. Es können beliebig viele catch-Blöcke hintereinander mit jeweils unterschiedlichen Typen definiert werden. Es ist erlaubt, für denselben Typ mehrere Routinen zu definieren, was jedoch nicht sinnvoll ist. Bei Auftreten eines throw-Operators wird die erste Routine aufgerufen, die dem Typ des Operators entspricht.

#include <stdio.h> void openfile(){ FILE* file = fopen("notexistingfile.txt", "r"); if(!file){throw 123;} } int main(int argc, char** argv){ try{ openfile(); }catch(const char* e){ printf("Throwing a string:\n%s\n", e); }catch(int e){ printf("Throwing an integer: %d\n", e); } return 0; }

Throwing an integer: 123

Tritt innerhalb des try-Blockes eine Ausnahme auf, die durch keine catch-Routine abgefangen wird, so wird dem Programm das Abort-Signal 6 gesendet, was ohne Abfangung zur Terminierung des Programmes führt. Um sämtliche, auch nicht-definierte Fehler abzufangen, gibt man anstelle eines Typs drei Punkte ... an, was umgangssprachlich auch als catch-all bezeichnet wird.

Manchmal sieht man die catch-Definition ohne Variablenangabe, also nur mit Typ. Dies ist genauso wie bei Funktionen legitim, bedeutet jedoch, dass kein eigentliches Fehlerobjekt übergeben wird.

}catch(int){ printf("An int-error occured.\n"); }

Eine detailiertere Beschreibung über die Benutzung der Typen bei catch-Blöcken findet man bei der Beschreibung der try-catch-Struktur.