C ++中的捕获块和类型转换

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

首先,让我们看一下代码,然后看一下输出内容以及它们的生成方式。

示例

#include <iostream>
using namespace std;
int main() {
   try{
      throw 'a';
   }
   catch(int a) {
      cout << "捕获整数值:" << a;
   }
   catch(...) {
      cout << "Entering into default catch block";
   }
}

输出结果

Entering into default catch block

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

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

示例

#include <iostream>
using namespace std;
class TestExcept1 {};
class TestExcept2 {
   public:
      TestExcept2 (const TestExcept1 &e ){ // Defining the Conversion constructor
         cout << "From the Conversion constructor";
      }
};
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

引发派生类型对象时,派生类型对象不会转换为基本类型对象。