C++ 中的 Catch 块和类型转换

c++server side programmingprogramming

在本节中,我们将了解如何使用 catch 块进行 C++ 中的异常处理和类型转换。

首先,让我们看一段代码,我们将看到输出是什么,以及它们是如何生成的。

示例

#include <iostream>
using namespace std;
int main() {
   try{
      throw 'a';
   }
   catch(int a) {
      cout << "Integer value is caught :" << a;
   }
   catch(...) {
      cout << "进入默认 catch 块";
   }
}

输出

进入默认 catch 块

那么,这背后的原因是什么?为什么会产生这种输出?我们可以看到字符"a"被抛出,但第一个 catch 块是针对 int 的。如果我们认为"a"的 ASCII 是一个整数,那么将进入第一个块,但这种转换不适用于 catch 块。

让我们看另一个例子。在此示例中,我们将看到未对抛出的对象调用转换构造函数。

示例

#include <iostream>
using namespace std;
class TestExcept1 {};
class TestExcept2 {
   public:
      TestExcept2 (const TestExcept1 &e ){ // 定义转换构造函数
         cout << "来自转换构造函数";
      }
};
main() {
   try{
      TestExcept1 exp1;
      throw exp1;
   } catch(TestExcept2 e2) {
      cout << "Caught TestExcept2 " << endl;
   } catch(...) {
      cout << "Entering into default catch block <<< endl;
   }
}

输出

Entering into default catch block

在抛出派生类型对象时,派生类型对象不会转换为基类型对象。


相关文章