catch

Das catch-Keyword ist nur in C++ verfügbar 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 in geschweiften Klammern {} 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.












An error occured:
Could not open file!
#include <stdio.h>

void openfile(){
  FILE* file = fopen("notexistingfile.txt", "r");
  if(!file){throw "Could not open file!";}
}

int main(){
  try {
    openfile();
  } catch(const char* e){
    printf("An error occured:\n%s\n", e);
  }
  return 0;
}

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

Details

Der catch-Block kann als Funktionsdefinition angesehen werden, welche ein Argument 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.














Throwing an integer: 123
#include <stdio.h>

void openfile(){
  FILE* file = fopen("notexistingfile.txt", "r");
  if(!file){throw 123;}
}

int main(){
  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;
}

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-Typen abzufangen, gibt man anstelle eines Typs drei Punkte ... an, was umgangssprachlich auch als catch-all bezeichnet wird.

Manchmal sieht man die catch-Deklaration 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 try-catch-Struktur.