所以我声明并定义了一个带有throw语句的函数和另一个嵌套前面描述的函数的函数。我的书在c ++中说如果嵌套函数throw数据类型与catch参数不匹配,那么调用函数将被终止。但是我的代码不会这样做。相反,它只是跳过抛出的异常,就好像它甚至没有被抛出一样。这是我应该说清楚的代码片段。
#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;
}
}
这只显示Hello,但不应该中止,因为-3在setlength的else if语句中,数据类型为字符串,但catch具有int数据类型。
答案 0 :(得分:1)
你在两个不同的地方捕捉,内部捕获在你的setwaidth函数中。在这里你抓住了一个int。因为您正在抛出一个字符串,所以不会捕获您的异常。之后,异常将调用堆栈向上移动到主函数,其中捕获了一个字符串并且catch执行cout << a;
此外,如果捕获字符串的异常不存在,程序将以未处理的异常错误终止,这是您的书所讨论的内容。
答案 1 :(得分:0)
我的书在c ++中说如果嵌套函数throw数据类型没有 匹配catch参数然后调用函数 终止。
你的书并没有说出你的想法。如果调用函数未捕获抛出的异常,则异常将转到下一个函数,依此类推。这样的每个函数的执行都会中止。如果它离开了main
函数,则程序将被终止。
注意代码cout << "We're good";
是如何执行的?这是因为没有捕获到异常时void setwaidth(double w)
函数没有继续。
有关详细信息,请参阅http://www.cplusplus.com/reference/exception/terminate/。
答案 2 :(得分:0)
如果try块没有为异常类型提供处理程序,则标准要求评估调用堆栈中的“next”try块(如果可用,则为周围的try块)。只有当没有任何匹配抛出类型的catch时,才会调用std::terminate()
。
标准包括
C ++ 11,15.3 / 6
如果在try块的处理程序中找不到匹配项,则搜索匹配的处理程序将继续在同一线程的动态环绕的try块中继续。
C ++ 11,15.3 / 9
如果找不到匹配的处理程序,则调用函数std :: terminate();在调用std :: terminate()之前是否展开堆栈是实现定义的。
setwaidth(-3);
调用setlength(-3);
投放string
,因为main
无法抓住setwaidth
而导致a = [{'long': None, 'tweetid': None, 'timestamp': None, 'lat': None}, {'userid': '113503286', 'long': '-87.624387', 'tweetid': '595084326489956352', 'timestamp': '1430714134224', 'lat': '41.852653'}, {'userid': '2421024865', 'long': '-87.629798', 'tweetid': '595084376632729600', 'timestamp': '1430714146179', 'lat': '41.878114'}]
b = filter(lambda x:"userid" in x, a)
print b
被抓住。