当有多个程序时,重新抛出如何工作?

时间:2017-01-30 15:34:45

标签: c++ exception-handling

这个程序没有给出我希望它给出的输出。

根据我对c ++重新抛出的理解,它应该执行程序的下一个catch块,但它不执行catch块,而是执行下一个程序。重新抛出实际上做了什么?

它给出的输出是“intcaught”,但我希望它输出“intcaughtcaught”。我的推理出了什么问题?

Order Allow,Deny
Deny from all

2 个答案:

答案 0 :(得分:2)

try {
    sign<int>(1);
    sign<int>('1');
} catch (...) {
    cout << "caught";
}

第一个sign调用[re-]会抛出异常,因此执行会跳转到打印"caught"文本。

就是这样。

执行不会再次跳回try块。因此,您的第二次sign来电永远不会发生。

您的期望将通过以下表格的代码得到满足:

try {
    sign<int>(1);
} catch (...) {
    cout << "caught";
}

try {
    sign<char>('1');
} catch (...) {
    cout << "caught";
}

请注意我在第二次调用中也更改了模板参数,否则您的"int"输出会再次显示。

答案 1 :(得分:1)

永远无法达到

sign<int>('1');。 (如果是,则根据您平台上的字符 encoding char文字'1'将转换为int

这是因为throw;之后的cout<<"int";会引发i(技术上通过引用),并且被main中的catch处理程序捕获。