我正在使用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 ++,他显示了正确的结果。
我没有任何建议。
感谢您的帮助。 亲切的问候。
答案 0 :(得分:4)
Integral promotions。 'A'
是一个字符文字,并被提升为int
。
因此:
throw 'A';
已执行; catch (int)
; throw;
重新抛出同一个对象(no copy is made); catch (int&)
抓住它(注意:catch (int)
可以抓住它,但它不是最近的捕获); 为了您的信息,[except.throw]/2
解释 的含义:
当抛出异常时,控制权转移到具有匹配类型(
[except.handle]
)的最近的处理程序; “nearest”表示遵循try关键字的复合语句或ctor-initializer的处理程序 最近由控制线输入,但尚未退出。
答案 1 :(得分:0)
这似乎是一个实现问题,因为即使在Windows上使用MinWGW也无法可靠地再现该行为,具体取决于版本。理论上,有Here's,只有用户定义的类可以转换为基类。
问题提到“正确的结果”,因为在理论上(并且在大多数架构上尝试过),throw(char)不能被catch(int)捕获,而只能通过catch(...)捕获。但仍然没有明确的解释为什么在某些情况下不是这样。