引发的字符但是整数被捕获:促销和转换如何处理异常?

时间:2018-03-19 15:06:55

标签: c++ try-catch

我正在使用MinGW 64位在Windows 10上使用NetBeans 8.1 Patch 1编写一些关于C ++异常的练习,但是当我在IDE中执行代码时,预期的结果并不相同。

以下是代码:

#include <cstdlib>
#include <iostream>

using namespace std;

void f() { 
   throw 'A';
}

int main() {
   try { 
      try { 
         f();
      } catch (int) { 
         cout << "In catch (int) 1" << endl;
         throw;
      } catch (...) {
         cout << "In catch (...) 1" << endl;
         throw 65;
      }
   } catch (int&) {
           cout << "In catch (int&)" << endl;
   } catch (int) {
           cout << "In catch (int) 2" << endl;
   } catch (const int) {
           cout << "In catch (const int)" << endl;
   } catch (...) {
           cout << "In catch (...) 2" << endl;
   }

   cout << "End of program" << endl;
   return EXIT_SUCCESS;
}

终端显示:

In catch (int) 1
In catch (int&)
End of program

通常,终端应显示在第一行“In catch(...)1”中,但我不明白为什么IDE没有显示出良好的结果。

我在PowerShell上使用g ++尝试了这个代码,结果相同,但是在Linux Ubuntu上使用g ++,他显示了正确的结果。

我没有任何建议。

感谢您的帮助。 亲切的问候。

2 个答案:

答案 0 :(得分:4)

在搜索合适的捕获时,会考虑

Integral promotions'A'是一个字符文字,并被提升为int

因此:

  1. throw 'A';已执行;
  2. 积分推广后
  3. catch (int);
  4. throw;重新抛出同一个对象(no copy is made);
  5. catch (int&)抓住它(注意:catch (int)可以抓住它,但它不是最近的捕获);
  6. 程序结束。
  7. 为了您的信息,[except.throw]/2解释 的含义:

      

    当抛出异常时,控制权转移到具有匹配类型([except.handle])的最近的处理程序;   “nearest”表示遵循try关键字的复合语句或ctor-initializer的处理程序   最近由控制线输入,但尚未退出。

答案 1 :(得分:0)

这似乎是一个实现问题,因为即使在Windows上使用MinWGW也无法可靠地再现该行为,具体取决于版本。理论上,有Here's,只有用户定义的类可以转换为基类。

问题提到“正确的结果”,因为在理论上(并且在大多数架构上尝试过),throw(char)不能被catch(int)捕获,而只能通过catch(...)捕获。但仍然没有明确的解释为什么在某些情况下不是这样。