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’语句才能处理该异常。

更新于:2022年12月13日

3K+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告