2015-05-04 41 views
0

所以我用throw语句和嵌套前面描述函数的其他函数声明和定义了一个函数。我的书在C++中说,如果嵌套函数throw数据类型与catch参数不匹配,那么调用函数将被终止。但是,我的代码不能这样做。相反,它只是跳过抛出的异常,就好像它甚至不在首位抛出一样。这里的代码片段应该使我所说的更清楚。尝试抛出catch C++嵌套函数

#include<iostream> 
#include<string> 
using namespace std; 
void setlength(double w) 
{ 
    if (w >= 0) 
    { 

    cout << "We're good"; 
    } 

    else if (w > -5 && w < 0) 
    { 
    string sample = "Hello"; 
    throw sample; 
    } 
} 
void setwaidth(double w) 
{ 
    try 
    { 
    setlength(-3); 
    cout << "OK"; 
    } 
    catch (int a) 
    { 
    cout << "Error has occurred"; 
    } 
    if (w >= 0) 
    { 

    cout << "We're good"; 
    } 

    else if (w > -5 && w < 0) 
    { 
    string sample= "Hello"; 
    throw sample; 
    } 
} 


int main() 
{ 
    try 
    { 
    setwaidth(-3); 
    cout << "OK"; 
    } 
    catch (string a) 
    { 
    cout << a; 
    } 
} 

这只是显示您好,但不应该这样,因为中止-3是在其与上述数据类型为字符串setlength的else if语句,但渔获有一个int数据类型。

+0

请提供样本输入和输出 – Zerp

+1

您是否尝试过查看您的代码?一行一行地运行它。它应该显示你好 – KRUKUSA

+2

我同意KRUKUSA:这应该显示“你好”。你为什么想别的?也许你有&&和||困惑? –

回答

0

我的书在C++说如果嵌套函数抛出数据类型不匹配 渔获参数,然后调用函数将 终止。

你的书并不是说你认为它是什么。如果一个抛出的异常没有被调用函数捕获,那么这个异常就出现在下一个函数中,等等。像这样的每个函数的执行被中止。如果它离开您的main功能,那么程序将被终止。

请注意代码cout << "We're good";未被执行?这是因为当异常未被捕获时void setwaidth(double w)函数没有继续。

有关更多详细信息,请参见http://www.cplusplus.com/reference/exception/terminate/

1

你在两个不同的地方捕捉,内部捕捉是在你的setwaidth函数。在这里,你捕捉到一个int。因为你正在抛出一个字符串,你的异常不会被捕获。此后,异常调用堆栈向上行进到一个字符串引起你的主要功能和抓执行cout << a;

此外,如果你的异常赶上字符串是不存在的程序会与未处理的异常错误是终止你的书正在谈论什么。

0

如果try块没有为异常类型提供处理程序,则标准需要调用堆栈中的“下一个”try块(如果可用,则为周围try块)进行评估。只有在没有任何捕捉符合投掷类型时,才会调用std::terminate()

该标准包括

C++ 11,15.3/6

如果处理程序try块之间没有发现匹配,对于匹配的处理器搜索在动态继续围绕同一个线程的try块。

C++ 11,15.3/9

如果没有发现匹配的处理器,该函数的std ::终止()被调用;在对std :: terminate()的调用之前,堆栈是否展开是实现定义的。

setwaidth(-3);电话setlength(-3);string,逮住在main因为setwaidth不抓住它。