C++创建自定义异常的程序
异常是C++的核心概念之一。异常发生在执行过程中出现意外或不可能的操作时。处理这些意外或不可能的操作被称为C++中的异常处理。异常处理主要使用三个特定的关键字完成,它们是‘try’、‘catch’和‘throw’。‘try’关键字用于执行可能遇到异常的代码;‘catch’关键字用于处理这些异常;‘throw’关键字用于创建异常。C++中的异常可以分为两种类型:STL异常和用户定义异常。在本文中,我们重点介绍如何创建这些自定义的用户定义异常。更多关于异常处理的详细信息,请点击此处。
使用单个类创建自定义异常
首先,我们看看如何使用单个类来创建一个自定义异常。为此,我们必须定义一个类并抛出该类的异常。
语法
//user-defined class class Test{}; try{ //throw object of that class throw Test(); } catch(Test t) { .... }
示例
#include <iostream> using namespace std; //define a class class Test{}; int main() { try{ //throw object of that class throw Test(); } catch(Test t) { cout << "Caught exception 'Test'!" << endl; } return 0; }
输出
Caught exception 'Test'!
‘try’块抛出该类,而‘catch’块只捕获该特定类的异常。如果有两个用户定义的异常类,则必须分别处理这两个类。
使用多个类创建自定义异常
如果有多个异常,则过程很简单,正如预期的那样,每个异常都必须分别处理。
语法
//user-defined class class Test1{}; class Test2{}; try{ //throw object of the first class throw Test1(); } catch(Test1 t){ .... } try{ //throw object of the second class throw Test2(); } catch(Test2 t){ .... }
示例
#include <iostream> using namespace std; //define multiple classes class Test1{}; class Test2{}; int main() { try{ //throw objects of multiple classes throw Test1(); } catch(Test1 t) { cout << "Caught exception 'Test1'!" << endl; } try{ throw Test2(); } catch(Test2 t) { cout << "Caught exception 'Test2'!" << endl; } return 0; }
输出
Caught exception 'Test1'! Caught exception 'Test2'!
我们必须使用两个不同的try-catch块来处理两个不同类类型的不同异常。现在我们看看是否可以使用构造函数来创建和处理异常。
使用构造函数创建自定义异常
我们可以使用类构造函数来创建自定义异常。在下面的示例中,我们看到异常的抛出和处理都在类构造函数本身内进行管理。
示例
#include <iostream> using namespace std; //define a class class Test1{ string str; public: //try-catch in the constructor Test1(string str){ try{ if (str == "Hello"){ throw "Exception! String cannot be 'Hello'!"; } this->str = str; } catch(const char* s) { cout << s << endl; } } }; int main() { Test1 t("Hello"); return 0; }
输出
Exception! String cannot be 'Hello'!
异常处理是C++提供的最重要的功能之一。我们可以继承C++异常类并用它来实现异常处理,但这只是良好的实践,并非创建自定义异常的必要条件。继承C++异常类的优点是,如果存在捕获std::exception的普通catch语句,它可以处理任何用户定义的异常,而无需了解具体的细节。需要注意的是,‘throw’语句只在‘try’块内有效,否则无效。只有当用户定义的类或某些STL类抛出异常时,‘catch’语句才能处理该异常。
广告