C++ 中的异常处理机制如何工作?


在 C++ 中,异常处理是处理运行时错误的过程。异常是在 C++ 中运行时抛出的事件。所有异常都派生自 std::exception 类。它是一个可以处理的运行时错误。如果我们不处理异常,它会打印异常消息并终止程序。

异常在 C++ 标准中定义为 `` 类,我们可以在程序中使用它。父类-子类继承关系如下所示:

C++ 中常见的异常类:

序号异常及描述
1std::exception
这是一个异常,也是所有标准 C++ 异常的父类。
2std::bad_cast
由 dynamic_cast 抛出的异常。
3std::bad_exception
此异常用于处理 C++ 程序中的意外异常。
4std::bad_alloc
通常由 new 抛出。
5std::logic_error
此异常可以通过阅读代码来检测。
6std::runtime_error
此异常无法通过阅读代码来检测。
7std::bad_typeid
由 typeid 抛出的异常。

关键词

异常处理中有 3 个关键词:try、catch 和 throw。

Try/Catch 块

在 C++ 中,异常处理使用 try/catch 语句执行。可能发生异常的代码放在 Try 块中。Catch 块用于处理异常。

示例代码

#include <iostream>
using namespace std;
class Sample1 {
   public:
      Sample1() {
         cout << "Construct an Object of sample1" << endl;
      }
      ~Sample1() {
         cout << "Destruct an Object of sample1" << endl;
      }
};
class Sample2 {
   public:
      Sample2() {
         int i=7;
         cout << "Construct an Object of sample2" << endl;
         throw i;
      }
      ~Sample2() {
         cout << "Destruct an Object of sample2" << endl;
      }
};
int main() {
   try {
      Sample1 s1;
      Sample2 s2;
   } catch(int i) {
         cout << "Caught " << i << endl;
   }
}

输出

Construct an Object of sample1
Construct an Object of sample2
Destruct an Object of sample1
Caught 7

用户自定义异常

我们可以通过继承和重写异常类的功能来定义我们自己的异常。

示例代码

#include <iostream>
#include <exception> using namespace std;
struct DivideByZero : public exception {
   const char * what () const throw () {
      return "My Exception";
   }
};
int main() {
   try {
      throw DivideByZero();
   } catch(DivideByZero& e) {
      cout << "Exception caught" << endl; cout << e.what() << endl;
   } catch(exception& e) {
   }
}

输出

Exception caught My Exception
what() = A public method provided by exception class and it has been overridden by all the child exception classes. It returns the cause of an exception.

更新于:2019年7月30日

226 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告