C ++ Ausnahmebehandlung
Ausnahmen sind Verfahrensfragen bei der Ausführung entstehen. C ++ Ausnahme bezieht sich auf spezielle geschieht, wenn das Programm ausgeführt wird, wie Versuche Nulloperation zu unterteilen.
Ausnahme ist ein Übertragungsprogramm Steuer Weise zur Verfügung gestellt. C ++ Ausnahmebehandlung beinhaltet dreiSchlüsselwörter: versuchen, zu fangen, werfen.
- werfen: Wenn Probleme auftreten, wird das Programm eine Ausnahme werfen.Dies wird durch die Verwendung des Schlüsselwortthrow getan zu vervollständigen.
- Fang: wo man mit dem Problem umgehen wollen, eine Ausnahme von einer Ausnahme - Handler gefangen wird.Fang Schlüsselwort wird verwendet , Ausnahmen zu fangen.
- versuchen: versuchenidentifiziert Blockcode eine spezifische Ausnahme aktiviert ist. Dahinter ist in der Regel durch einen oder mehrere catch-Blöcke folgen.
Wenn ein Block eine Ausnahme auslöst, fangen die Ausnahme - Methode verwendetversuchen und fangenKeywords. Platz könnte versuchen, Block einen Ausnahmecode wirft, versuchen Blockcode ist ein Code-geschützten genannt. Verwenden Sie try / catch-Anweisung Syntax lautet wie folgt:
try { // 保护代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 }
Wenn Sie Block in verschiedenen Kontextenversuchen wird , eine andere Ausnahme werfen, diesmal können Sie versuchen , mehrere catch- Anweisungen zur Liste verschiedene Arten von Ausnahmen zu fangen.
Werfen Sie eine Ausnahme
Sie können diethrow - Anweisung überall dort verwenden , in der Code - Block eine Ausnahme auslöst.Operand throw-Anweisung kann jeder Ausdruck Typ des Ergebnisses des Ausdrucks die Art der Ausnahme ausgelöst bestimmt.
Das Folgende ist eine Ausnahme Null durch Beispiele geteilt Versuchen:
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
Fangen Sie die Ausnahme
catch - Block hinter dem try- Block Ausnahmen erfassen. Sie können die Art der Ausnahme angeben, die Sie erfassen möchten, die von der Ausnahme in Klammern nach dem Schlüsselwort catch Entscheidungen deklariert wird.
try { // 保护代码 }catch( ExceptionName e ) { // 处理 ExceptionName 异常的代码 }
Der obige Code wird eine Artexception Ausnahme erfassen.Wenn Sie Block fangen wollen jede Art von Ausnahme ausgelöst Try-Block umgehen kann, müssen Sie die Ausnahme in Klammern Auslassungszeichen verwenden ... Anweisung, wie folgt:
try { // 保护代码 }catch(...) { // 能处理任何异常的代码 }
Hier ist ein Beispiel für eine Division durch Null eine Ausnahme auslöst, und die Ausnahme im catch-Block gefangen.
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; }catch (const char* msg) { cerr << msg << endl; } return 0; }
Da wir einen Typconst char * Ausnahme auslösen, also , wenn die Fangmenge, die Ausnahme, müssen wir const char * im catch - Block verwenden.Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:
Division by zero condition!
C ++ Standard Ausnahmen
C ++ bietet eine Reihe von Standard - Ausnahmen in<Ausnahme> definiert sind ,wir diese Standard - Ausnahmen im Programm verwenden können. Sie sind auf organisierte Eltern-Kind-Klassenhierarchie wie folgt auf:
Die folgende Tabelle ist eine Beschreibung von jeder der obigen Hierarchie erscheinen abnormal:
异常 | 描述 |
---|---|
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_alloc | 该异常可以通过new抛出。 |
std::bad_cast | 该异常可以通过dynamic_cast抛出。 |
std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
std::bad_typeid | 该异常可以通过typeid抛出。 |
std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
std::underflow_error | 当发生数学下溢时,会抛出该异常。 |
Definieren Sie eine neue Ausnahme
Sie können neue Ausnahme vonAusnahmeklasse Vererbung und Überlastung definieren.Das folgende Beispiel zeigt, wie std :: Exception-Klasse verwenden, um ihre eigenen Ausnahmen zu implementieren:
#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //其他的错误 } }
Daraus ergeben sich die folgenden Ergebnisse:
MyException caught C++ Exception
Washier () -Methode ist eine öffentliche Ausnahmeklasse , sofern sie alle Unterausnahmeklassen überlastet wurde.Dadurch wird die Ursache dieser Ausnahme erzeugt zurückzukehren.