Exception-Spezifikationen (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Standard-Exception-Behandlung in C++

Sie können festlegen, welche Exceptions eine Funktion auslösen kann. Wird eine Exception mit dem falschen Typ nach einer Funktion ausgelöst, bewirkt dies einen Laufzeitfehler. Die Syntax für eine Exception-Spezifikation lautet:

exception-specification:

throw (type-id-list) // type-id-list is optional
type-id-list:

type-id
type-id-list, type-id

Die folgenden Beispiele sind Funktionen mit Exception-Spezifikationen.

 void f1(); // The function can throw any exception
 void f2() throw(); // Should not throw any exceptions
 void f3() throw(A, B*); // Can throw exceptions publicly derived from A, or a pointer to publicly derived B

Die Definition und alle Deklarationen einer solchen Funktion müssen eine Exception-Spezifikation mit derselben Menge von type-ids haben. Wenn eine Funktion eine Exception auslöst, die nicht in ihrer Spezifikation enthalten ist, ruft das Programm die Funktion unexpected auf.

Aus den folgenden Gründen ist es nicht ratsam, eine Exception festzulegen:

  • Erstens wird unter Windows die Laufzeit-Performance gestört, wenn Exception-Spezifikationen für eine Funktion bereitgestellt werden.
  • Zweitens können Sie unerwartete Fehler zur Laufzeit erhalten. Angenommen, Ihr System verwendet Exception-Spezifikationen und in seiner Implementierung ein anderes Subsystem. Nehmen Sie nun an, das Subsystem wird geändert, damit es neue Exception-Typen auslöst. Wenn Sie den Code des neuen Subsystems verwenden, könnten Sie Laufzeitfehler erhalten, ohne irgendeinen Hinweis des Compilers, dass dies vorkommen könnte.
  • Drittens könnten Sie bei der Verwendung von virtuellen Funktionen das Programmdesign verletzen. Und zwar, weil die Exception-Spezifikation nicht als Teil des Funktionstyps angesehen wird. Im folgenden Code wird z.B. die abgeleitete Klasse BETA::vfunc so definiert, dass sie keine Exception auslöst – eine Abweichung von der Originaldeklaration der Funktion.
 class ALPHA {
 public:
 	struct ALPHA_ERR {
 	};
 
 	virtual void vfunc(void) throw(ALPHA_ERR) {
 	} // Exception specification
 };
 
 class BETA : public ALPHA {
 	void vfunc(void) throw() {
 	} // Exception specification is changed
 };

Siehe auch