尝试Throw Catch c ++嵌套函数

时间:2015-05-04 21:05:39

标签: c++ exception-handling throw

所以我声明并定义了一个带有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数据类型。

3 个答案:

答案 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 被抓住。