【发布时间】:2016-11-29 11:11:28
【问题描述】:
程序通过class Menu与用户通信,所以main()是这样的:
int main() {
try {
Menu menu(/*...*/);
while (true) {
menu.printOptions();
menu.chooseOption();
}
}
catch (const char *error) { /*Resolve error.*/ }
catch (int code) { /*Exit with code.*/ }
}
当前class Menu用于退出的选项如下:
void exit() {
// Release memory.
throw 0;
}
应该避免这样的构造吗?它们是否有一些不可预测(或不希望的)副作用?
【问题讨论】:
-
使用异常机制作为控制结构流是不明智的。在这种特殊情况下,只需致电
std::exit() -
我通常不会创建一个名为
exit的函数,因为这会影响std::exit函数。正如@StoryTeller 建议的那样,我会小心使用std::exit退出,因为它不会展开堆栈。 -
@TommyAndersen:它会超载它,而不是隐藏它。只有在重载解决方案中同时考虑两者的情况下才会有问题。我确实忘记了堆栈展开。绝对应该只是
return的状态一直到 main。 -
@TommyAndersen - 不,
exit不会影响std::exit,因为std::exit与exit的名称不同。这就是我们有命名空间的原因。当然,除非你用using namespace std;吹走std,在这种情况下你会自找麻烦。 -
@StoryTeller - 不,
exit不会超载std::exit。它们没有在同一范围内定义。
标签: c++ throw program-flow